안녕하세요 투니드입니다!
StardewValleyLike 게임을 만들어보고 있는데요! 인벤토리 시스템을 스크립터블 오브젝트로 구성해서 시스템을 구축해서 잘 이용하고 있었습니다! 그런데 오늘 날짜로 '갑자기!' 아이템을 획득해도, 아이템을 제작해도! 특정 시점으로 계속해서 초기화가 되는겁니다!
지금 인벤토리 시스템을 구축한 지 한두 달 됐는데 이제 와서 갑자기 이러니까 배신감(?)도 들고 어디서 어떻게 고쳐야 할지 감이 잘 안 오더라고요....
그래서 스크립터블 오브젝트에 대해서 좀 자세하게 파고들고 나서야 단서를 찾을 수 있었습니다!
1. 스크립터블 오브젝트는 에셋으로 저장됩니다

위와 같은 스크립터블 오브젝트를 만들 수 있는 클래스 파일이 하나 있습니다! 그리고 경로를 지정해서 스크립터블 오브젝트를 만들어서 사용 중이었죠! (여러분도 그렇게 사용하고 계실 겁니다!)
그러면 이제 파일의 경로로 가보면

이런 식으로 에셋 형식으로 저장이 되어있어요! 그리고 파일의 내부를 보기 위해 메모장의 힘을 빌려보면

제가 인벤토리에 가지고 있는 아이템의 리스트가 전부 들어가 있는 걸 확인할 수 있죠
그런데 문제는 지금까지는 자동저장, 자동로드가 항상 잘 되어왔는데 왜 갑자기 일정시점을 기준으로 계속 돌아가는지가 문제입니다!
위에 경로파일을 다시 보면

데이터가 바뀌면 제 생각에는 수정한 날짜가 바뀌어야 되는데 안 바뀌고 계속 저 시점인 게 문제였다는 말입니다!
왜냐면 지금까지는 잘 됐었으니까요!!
아무튼 여러 방면으로 알아본 결과 결국 스크립터블 오브젝트라고 하더라도 일정 시점에 저장을 해주는 로직이 필요하다고 하더라고요! (지금까지는 운이 좋아서 잘 사용을 했었나 봅니다)
물론 정식으로 빌드를 준비할 때는 제이슨 데이터로 세이브 로드를 구현할 예정이긴 하지만 에디터에서 이런 문제가 생길 줄 몰랐거든요!
아무튼! 결국 세 시간 정도 맨땅에 헤딩을 하다가 알아낸 사실은 스크립터블 오브젝트도 저장을 해야 한다! 인데 어떻게 저장하는지를 조금 더 찾아 헤매기는 했습니다!
#region 250324 스크립터블 오브젝트가 자동으로 저장되지 않는 문제 해결을 위한 코드 추가
// 인벤토리 저장
public void SaveInventory()
{
// 에셋이 수정되었음을 Unity에 알리기
#if UNITY_EDITOR
EditorUtility.SetDirty(this); // 수정된 상태를 Unity에 알림
AssetDatabase.SaveAssets(); // 에셋에 저장
Debug.Log("Inventory saved manually.");
#endif
}
#endregion
네 이렇게 간단하게 해결될 문제였습니다! 이걸 아이템을 획득할 때마다 하는 건 비용이 너무 높을 것 같아서 저는 따로 조건을 설정해서 SaveInventory()메서드를 호출하는 방식으로 변경했습니다!
로드도 물론 간단하게 가능하지만, 세이브 데이터를 스크립터블 오브젝트가 어차피 참조를 하고 있으니, 지금 당장은 필요하지 않아 구현을 해놓지는 않았습니다! 뭐 게임이 시작했을 때 라던지 씬이 바뀌었을 때 라던지 이런 때에 세이브랑 로드를 같이 해주면 되겠죠? 로드가 필요하신 분들이 계실지 모르니 코드는 공유해 놓을게요!
public static ItemContainer LoadInventory(string assetPath)
{
// 에셋 경로를 통해 해당 ScriptableObject를 불러옴
#if UNITY_EDITOR
return AssetDatabase.LoadAssetAtPath<ItemContainer>(assetPath);
#else
return null;
#endif
}
위 접은 글에서 매개변수로 경로를 맞춰주고, LoadAssetAtPath<> 제네릭에 여러분이 사용 중인 스크립터블 오브젝트 클래스를 넣어주면 됩니다!
스크립터블 오브젝트에 대해서 제가 큰 오해를 하고 있었습니다...
과거에는 제이슨 데이터 없이도 빌드해도 자동저장 기능을 제공할 줄 알았는데 그것도 아니었고 (과거에 깨달음)
에디터상에서의 자동저장조차 손길이 조금은 필요하다는 사실을 전혀 몰랐어요 ㅠㅠ
여러분들은 저처럼 헤매지 말고 특정 시점, 분기점마다 이렇게 저장을 해서 사용하시길 바랍니다!
감사합니다!
'유니티 기초 배워보기' 카테고리의 다른 글
스크립터블 오브젝트!(ScriptableObject) (0) | 2025.03.24 |
---|---|
Canvas 기본 컴포넌트!(Canvas, Canvas Scaler, Graphic) (0) | 2025.03.13 |
프리팹(Prefab)! (0) | 2025.03.05 |
Sortign Layer (0) | 2024.10.16 |
충돌체 (Collider) (0) | 2024.10.16 |