⚠️ 개발 중단 - 재빌드 없이 시트 데이터를 가져와 테스트 할 수 있게 QA 에게 제공해야함. 이 구조는 적합하지 않음
- 기획자가 Google Sheet를 수정할 때마다 개발자가 데이터를 일일이 추가하는 건 꽤 번거롭다. 그래서 시트를 수정하면, 유니티 에디터에서 버튼 하나만 눌러도 자동으로 데이터를 불러올 수 있도록 개발을 시작했다.
- 아이템이 많아 데이터와 로직을 분리하여 독립적인 데이터 관리가 필요해
Scriptable Object를 이용해 아이템 데이터들을 관리했다[CreateAssetMenu(fileName = "ItemSo", menuName = "SO/ItemSO")] public class ItemSO : ScriptableObject { public int itemID; public string itemName; public ItemCategory itemCategory; public Sprite itemIconSprite; [Space(10)] public string explanation; public string itemMainPath; public string itemSubPath; }[CreateAssetMenu(menuName = "SO/ItemDatabase")] public class ItemDatabase : ScriptableObject { public List<ItemSO> items = new List<ItemSO>(); public ItemSO GetItem(int id) { return items.Find(i => i.itemID == id); } public ItemSO GetItem(string name) { return items.Find(i => i.itemName == name); } }
- 기획자가 시트에 데이터를 추가하면, 그에 맞춰 ScriptableObject 데이터도 자동으로 생성되어야 했다. 그래서 AssetDatabase와 ScriptableObject 관련 함수를 활용해 그 기반을 설계했다.
public class ItemDataImporter { // Item Database 경로 private const string itemDatabasePath = "Assets/01. Scripts/SO/Item/ItemDatabase.asset"; // Scriptable Object 저장 폴더 private const string assetFolderPath = "Assets/01. Scripts/SO/Item"; [MenuItem("Tools/Import Item Data From Sheet")] public static void ImportItemDataFromSheet() { ItemDatabase itemDatabase = AssetDatabase.LoadAssetAtPath<ItemDatabase>(itemDatabasePath); itemDatabase.items.Clear(); if(itemDatabase == null) { Debug.LogError("Item Database 경로를 찾을 수 없다."); } for(int i = 0; i < 5; i++) { string assetPath = $"{assetFolderPath}/TestItem_{i}.asset"; ItemSO itemData = ScriptableObject.CreateInstance<ItemSO>(); AssetDatabase.CreateAsset(itemData, assetPath); itemDatabase.items.Add(itemData); } AssetDatabase.SaveAssets(); } }
- 에디터에서 특정 경로에 있는 에셋을 불러오는 함수
⚠️ 런타임에서는 동작하지 않음 → 에디터 전용 코드에서만 사용 가능.AssetDatabase.LoadAssetAtPath<T>(path);
- 스크립트에서 새로운 에셋 파일 생성할 때 사용하는 함수
⚠️ 같은 경로에 있으면 덮어쓰지 않고 에러가 발생함, 생성 전에 존재 여부 체크 하는게 좋음
⚠️ 런타임에서는 동작하지 않음 → 에디터 전용 코드에서만 사용 가능.AssetDatabase.CreateAsset(Object asset, string path);
- 프로젝트의 변경된 에셋 데이터를 디스크에 저장하는 함수
⚠️ 자동으로 저장되진 않기 때문에, CreateAsset만 호출하고 SaveAssets를 안하면 저장이 되지 않은 상태로 남을 수 있음
⚠️ 런타임에서는 동작하지 않음 → 에디터 전용 코드에서만 사용 가능.AssetDatabase.SaveAssets();
- ScriptableObject 타입의 인스턴스를 생성할 때 사용하는 함수
📌 인스턴스만 만들어질 뿐, 아직 유니티 프로젝트에 저장된 건 아님
→ CreateAsset으로 저장 필요ScriptableObject.CreateInstance<T>();
음~ 이거 맛있네요