우리 프로젝트에서는 기획자님께서 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>> 타입으로 개선했다.
키를 Enum타입으로 넣어주고, 키값의 타입을 List<ITable>로 더 구체화시켰다. UGS에서 한 시트의 데이터를 읽어올 때 시트별 클래스를 만들어서 읽어오는데, 그때 쓰이는 클래스에 모두 GoogleSheet.ITable이 상속받아져있다. 그래서 ITable로 받아오는 것으로 해결했다.
데이터를 로드하는 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;
}
'프로젝트 일지 > Unity' 카테고리의 다른 글
[Unity/TIL] 2D Sprite 정렬 기준 바꾸기 (Transparency Sort Axis) (9) | 2025.04.22 |
---|---|
[Unity/TIL] 트러블슈팅 - 비동기 생성 함수 로직 오류 해결 (2) | 2025.04.21 |
[Unity/TIL] '오집마' 최종 프로젝트 개발일지 (2) | 2025.04.16 |
[Unity/TIL] 프리팹 Variant (2) | 2025.04.15 |
[Unity/TIL] 방치형 게임에서 유닛 스폰 최적화 구조 설계하기 (1) | 2025.04.14 |