[Unity] 개발공부 - Scriptable Object 이용한 데이터 자동화 관리

김필원·2025년 4월 11일
post-thumbnail

개요

⚠️ 개발 중단 - 재빌드 없이 시트 데이터를 가져와 테스트 할 수 있게 QA 에게 제공해야함. 이 구조는 적합하지 않음

  • 기획자가 Google Sheet를 수정할 때마다 개발자가 데이터를 일일이 추가하는 건 꽤 번거롭다. 그래서 시트를 수정하면, 유니티 에디터에서 버튼 하나만 눌러도 자동으로 데이터를 불러올 수 있도록 개발을 시작했다.

Scriptable Object 를 이용해 아이템 데이터 관리

  • 아이템이 많아 데이터와 로직을 분리하여 독립적인 데이터 관리가 필요해
    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);
    }
}

Scriptable Object 를 이용해 데이터 자동화 관리

  • 기획자가 시트에 데이터를 추가하면, 그에 맞춰 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 관련 함수

  • 에디터에서 특정 경로에 있는 에셋을 불러오는 함수
    ⚠️ 런타임에서는 동작하지 않음 → 에디터 전용 코드에서만 사용 가능.
AssetDatabase.LoadAssetAtPath<T>(path);
  • 스크립트에서 새로운 에셋 파일 생성할 때 사용하는 함수
    ⚠️ 같은 경로에 있으면 덮어쓰지 않고 에러가 발생함, 생성 전에 존재 여부 체크 하는게 좋음
    ⚠️ 런타임에서는 동작하지 않음 → 에디터 전용 코드에서만 사용 가능.
AssetDatabase.CreateAsset(Object asset, string path);
  • 프로젝트의 변경된 에셋 데이터를 디스크에 저장하는 함수
    ⚠️ 자동으로 저장되진 않기 때문에, CreateAsset만 호출하고 SaveAssets를 안하면 저장이 되지 않은 상태로 남을 수 있음
    ⚠️ 런타임에서는 동작하지 않음 → 에디터 전용 코드에서만 사용 가능.
AssetDatabase.SaveAssets();

ScriptableObject 관련 함수

  • ScriptableObject 타입의 인스턴스를 생성할 때 사용하는 함수
    📌 인스턴스만 만들어질 뿐, 아직 유니티 프로젝트에 저장된 건 아님
    → CreateAsset으로 저장 필요
ScriptableObject.CreateInstance<T>();
profile
안녕하세요 개발자 김필원입니다.

2개의 댓글

comment-user-thumbnail
2025년 4월 11일

음~ 이거 맛있네요

1개의 답글