
가끔씩 인벤토리 슬롯이 제대로 로드되지 않는 문제가 발생하였다.
게임을 저장하는 SaveData에서 인벤토리 슬롯은 Slot의 배열로 저장이 된다.



실제로 저장된 GameSave.json을 보면 itemSO부분이 "instanceID"로 저장이 되어있었다.
처음 봤을 때는 이에 대해 잘 모르는 상태였지만, 직관적으로 뭔가 SO정보가 뭔가 완전하게 저장되는 형태가 아니라는 생각이 들어 정보를 찾아보았다.
1. instanceID 개념
우선 instanceID는 Unity에서 객체를 관리하기 위해 사용하는 식별자이다.
이 instanceID는 객체가 메모리에서 로드될 때, Unity 자체에서 동적으로 생성한다. 그리고 이를 Json 직렬화를 할 때, 객체의 데이터를 직접 저장하는 것이 아니라, instanceID의 참조로 저장한다.
그래서 위의 "itemSo"를 instanceID로 저장한 것이다.
2. 문제가 발생했던 원인
그러나 이 instanceID는 변하지 않는 값이 아니다.
instanceID는 메모리에 객체가 로드 될 때 생성이 되기 때문에, 객체가 메모리에서 해제되고, 다시 로드 된다면, 새로운 instanceID가 생성이 된다. 그럴 경우, 저장된 값과 불러올 SO가 일치하지 않게 되고, 그래서 가끔씩 인벤토리가 제대로 로드되지 않는 증상이 발생했던 것이다.
3. 해결법
ItemSO들은 ItemCode라는 각자의 int 값이 존재한다. 저장할 때, 이 ItemCode값을 이용해 저장하고, 로드할 때, 이 ItemCode를 Key값, ItemSO를 value값으로 하는 Dictionary에서 불러오는 식이면 로드될 때 문제가 없을 것으로 생각된다.
'내일배움캠프 TIL' 카테고리의 다른 글
| 내일배움캠프 67일차 TIL "중간발표 기능 정리" (0) | 2024.12.20 |
|---|---|
| 내일배움캠프 66일차 TIL "상점 기능 구상" (0) | 2024.12.19 |
| 내일배움캠프 64일차 TIL "foreach문 중의 수정" (0) | 2024.12.17 |
| 내일배움캠프 63일차 TIL "프로젝트 중간 점검" (0) | 2024.12.16 |
| 내일배움캠프 62일차 TIL "2D 타일맵 기반의 건축기능" (0) | 2024.12.13 |