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테이블만 수정하면 되서 굉장히 편하게 바뀐거 같다.