프로젝트 일지/Unity

[Unity/TIL] DataManager 사용성 개선

톰마토 2025. 4. 18. 22:24

우리 프로젝트에서는 기획자님께서 Google Sheet에 데이터 테이블을 작성하기를 희망하셨기 때문에 UGS(Unity Google Sheet)를 사용해서 데이터 테이블을 읽어오고 있다. 
https://shlifedev.gitbook.io/unitygooglesheets

 

Unity Google Sheet | UGS 개발문서

무료 오픈소스 라이브러리 입니다.

shlifedev.gitbook.io

 

DataManager에서 데이터를 미리 로드해서 캐싱해놓는 역할을 한다. 팀원들 모두가 가져다 쓸 일이 많은데 사용성이 너무 구려서 조금이나마 개선했다.

개선점 1. 데이터 담아두는 Dictionary의 타입 변경

이전에 Dictionary<string, List<object>> 타입으로 데이터를 받아놨었는데, 키가 string이라서 오류 가능성이 있고 타입이 object라서 직관성도 부족하고 캐스팅이 복잡해지는 문제가 있었다. 

=> Dictionary<Enums.Sheet, List<ITable>> 타입으로 개선했다.

데이터 담아둔 곳 : Datas

키를 Enum타입으로 넣어주고, 키값의 타입을 List<ITable>로 더 구체화시켰다. UGS에서 한 시트의 데이터를 읽어올 때 시트별 클래스를 만들어서 읽어오는데, 그때 쓰이는 클래스에 모두 GoogleSheet.ITable이 상속받아져있다. 그래서 ITable로 받아오는 것으로 해결했다.

Stage Sheet의 데이터 틀이 되는 클래스(UGS가 생성한 클래스임)

 

데이터를 로드하는 LoadData 함수 (in DataManager.cs) 

public void LoadData<T>() where T : ITable
{
    string typeName = typeof(T).Name;
    Enums.Sheet type;
    Enum.TryParse<Enums.Sheet>(typeName, out type);
    
    Datas[type] = new List<ITable>();
    List<T> list = UnityGoogleSheet.GetList<T>(); // GetList 내부에서 로드해둔 데이터가 없으면 LoadAllData()를 실행
    for (int i = 0; i < list.Count; i++)
    {
        Datas[type].Add(list[i]);
    }
}

 

개선점 2. 데이터 한 행을 읽어올 수 있는 GetTable 함수 제공

시트의 한 행을 읽어올 때 다음과 같은 코드로 작성해야 한다.

DefaultTable.Tower OneRow = dataManager.Datas[Enums.Sheet.Tower][행번호] as DefaultTable.Tower; 

캐스팅까지 해야하다 보니 사용하기 번거로워서 GetTable 제네릭 함수를 제공하기로 했다.

public T GetTable<T>(Enums.Sheet sheetType, int idx) where T : class, ITable
{
    if (Datas.ContainsKey(sheetType) == false) return null;
    if (idx >= Datas[sheetType].Count) return null;

    return Datas[sheetType][idx] as T;
}

 

개선점 3. Sheet 전체 정보인 List<ITable>을 한 번에 형변환해주는 Util 기능 제공

Managers.Data.Dats[시트타입] 으로 가져오면 해당 시트의 데이터들이 List<ITable> 형태로 들어있다. 그래서 사용하기 위해 개선점 2에서처럼 한 번 더 캐스팅을 해서 사용해야 하는 번거로움이 있다. 그래서 List<ITable>을 List<DefaultData.Wave> 등으로 바로 변환시켜주는 기능을 제공한다.

public static List<T> TableConverter<T>(List<GoogleSheet.ITable> origins) where T : GoogleSheet.ITable
{
    List<T> res = new List<T>();
    foreach (GoogleSheet.ITable item in origins)
    {
        res.Add((T)item);
    }
    return res;
}

 

 

728x90