상점 구현 - 오류(직렬화 문제) / 상점 구조 수정

2025. 1. 3. 14:27카테고리 없음

상점을 만들기 위해서 UI를 먼저 만들고 거기에 상점의 데이터를 저장하는 스크립트상점UI를 관리하는 스크립트, 상점의 상품들을 정보를 담는 스크립트상점의 정보를 담을 스크립트 이렇게 4개를 추가했다.

문제

private void Start()
{
    AddItem(1601);
    AddItem(1602);
    AddItem(1701);
}

private void AddItem(int itemId)
{
    ItemGradeType type = DataManager.Instance.Item.GetItemData(itemId).itemType == ItemType.Consumption ? ItemGradeType.Uncommon : ItemGradeType.Rare;
    StoreItemInstance item = new StoreItemInstance();
    {
        item.itemId = itemId;
        item.gradeType = type;
    }
    
    _items.Add(item);
    DatabaseManager.Instance.SaveData(_items, item.GetType().ToString());
}

상점의 데이러를 저장하기 위해서 아이템을 추가할려고 하는데 계속 _items.Add(item)이 부분이 NULL로 뜨는거다. 그래서 이유를 찾아보니 상점의 정보를 담는 스크립트의 정보를 Newtonsoft.Json 라이브러리를 사용해서 직렬화를 할려고 하는데 해당 스크립트에 직렬화 시키는 코드를 안넣어놔서 오류가 놨던거다. 그래서 [System.Serializable] 스크립트 위에 해당 코드를 추가해서 다시 실행했는데 또 똑같은 오류가 떳다.

 

[System.Serializable]
public class StoreItemInstance : MonoBehaviour
{
    public int itemId;
    public ItemGradeType gradeType;
}

 

두번째 오류 및 해결

또다시 이유를 찾아보니..... StoreItemInstance 스크립트에서 MonoBehaviour를 상송받고있어서 오류가 났던거다...

 

MonoBehaviour를 상속받는 클래스에서 Newtonsoft.Json으로 직렬화를 시도할 때, Unity의 MonoBehaviour가 내부적으로 참조하는 객체들이 직렬화될 수 없어서 null 참조 오류가 발생했던 거였다. 그래서 MonoBehaviour를 지우고 실행하니 작동이 잘됐다.

 

[System.Serializable]
public class StoreItemInstance
{
    public int itemId;
    public ItemGradeType gradeType;
}

 

문제 (구조를 잘못잡음) 해결(데이터베이스에서 바로 데이터 가져오기)

Shop은 데이터베이스에서 데이터를 가져와서 바로 UI를 띄우면 되지 ShopManager를 만들어서 굳이 데이터를 저장할 필요가 없었다!!!

그래서 만들어뒀던 StoreItemInstance를 지우고 데이터베이스에서 바로 데이터를 가져올 수 있게 만들기 위해서 구조를 다 바꿨다.

 

그렇게 하니 데이터를 따로 저장할 필요도 없고 아이템 추가할때 Shop테이블만 수정하면 되서 굉장히 편하게 바뀐거 같다.