
3D 팀 프로젝트의 완성도를 높이는 과정에서 저장 불러오기를 구현하는 중이었다.
캐릭터의 상태 수치, 맵 데이터를 저장하고 불러오기를 구현했는데 인벤토리쪽에서 불러오기가 안되는 현상이 생겼다.
인벤토리에는 각 슬롯에 ItemSO라는 데이터가 들어가있는데 디버그를 찍어보니 불러오기를 할 때 ItemSO가 null이 상태였다.
구글링을 해보니 프리팹에서 생성된 SO의 인스턴스가 직렬화가 안된다는 글을 봤다.
정확한 원리를 알아내진 못했지만, SO를 이용하지 말아야겠다고 결론을 내리고 인벤토리를 구성하는데 필요한 itemID등을 직렬화해서 저장했다.
그리고 itemSO를 DataManager에 넣어둬서 itemID 비교를 통해 필요한 SO를 인벤토리에 넣어주는 방법으로 해결했다.
private void DataSerialize()
{
foreach (var slot in CharacterManager.Instance.inventory.slots)
{
if (slot.item != null)
{
SaveInventory saveData = new SaveInventory();
saveData.itemID = slot.item.itemID;
saveData.quantity = slot.quantity;
saveData.equipped = slot.equipped;
data.inventories.Add(saveData);
}
}
}
//==========================
private void DataDeserialize()
{
foreach (var slot in data.inventories)
{
ItemSO itemSO = CheckSO(slot.itemID);
if (itemSO != null)
{
CharacterManager.Instance.inventory.AddItem(itemSO, slot.quantity, slot.equipped);
}
}
}