본캠프_TIL_58일차(데이터 흐름 고민)
오늘 한 일
- 오전
- 1차 합치기
- 오후
- 기존 데이터를 불러오는 방식 → SO를 바탕으로 데이터 불러오기.
공부한 것
데이터 흐름 고민
처음에는 각 매니저마다 필요한 정보를 가져오려고했지만
매니저가 초기화가 안된 상태에서 데이터를 가져올 순 없었습니다.
각 매니저를 처음 씬이 시작할때 생성이 되도록 해봤지만
화면이 겹치는 문제가 생겼습니다
(ex : 매니저에서 게임 오브젝트를 호출하는 경우가 있어 해당 씬에 안쓰는 오브젝트가 생기는 상황)
데이터만 가져오기위해 오브젝트까지 가져오게되는 문제가 있어
DataManager로 데이터만 관리하는 매니저 스크립트가 필요했습니다.
데이터 흐름
데이터의 흐름을 수정했습니다.
수정한 데이터 흐름은 다음과 같습니다.
[Google Spreadsheet]
↓
[UGS.Generated]
- JSON 파일
- C# 스크립트 (GetList() 포함)
↓
[DataManager]
- 데이터 로드: GetList()
- SO 생성: ScriptableObject.CreateInstance<T>()
- 데이터 캐싱: StageSO[], TestSO[]
↓
[사용 코드]
- DataManager.Instance.GetTestSprite()
DataManager에 SO생성과 데이터 캐싱이 추가되었습니다.
데이터 흐름 설명
1. 데이터 작성
구글 스프레드 시트를 통해 시트를 작성합니다.
2.Generate
GUI Manager에서 Generatef를 해줍니다
TestTable.json
TestTable.User.cs
와 같은 .json과 .cs 파일이 생성됩니다.
3. ScriptableObject로 데이터 변환
받아올 데이터의 SO를 작성해줍니다.
using UnityEngine;
[CreateAssetMenu(fileName = "TestSO", menuName = "TestSO")]
public class TestSO : ScriptableObject
{
public int id; // test 아이디
public string testName; // test이름
public string testSpriteName; // test스프라이트 이름
}
4. 데이터 캐싱
DataManager에서 데이터를 캐싱해줍니다.
public class DataManager : SingletonBase<DataManager>
{
private TestSO[] _testSOs;
protected override void Awake()
{
base.Awake();
DontDestroyOnLoad(gameObject);
//data캐싱
_testSOs = SetTestSOs();
}
private TestSO[] SetTestSOs()
{
List<TestTable.Data> testDataList = TestTable.Data.GetList();
TestSO[] testSOs = new TestSO[testDataList.Count];
for (int i = 0; i < testSOs.Length; i++)
{
testSOs[i] = ScriptableObject.CreateInstance<TestSO>();
testSOs[i].id = testDataList[i].Id;
testSOs[i].testName = testDataList[i].name;
testSOs[i].testSpriteName = testDataList[i].spriteName;
}
return testSOs;
}
public TestSO[] GetTestSprite()
{
if (_testSOs == null)
{
_testSOs = SetTestSOs();
}
return _testSOs;
}
}
_testSOs = SetTestSOs();
필요한 데이터를 내부 필드 (_testSOs)에 저장합니다.
GetTestSprite();
_testSOs 를 반환해줍니다.
5. 데이터 요청방식
private TestSO[] _testSOs;
_testSOs = DataManager.Instance.GetTestSprite();
GetTestSprite()를 호출하여 캐싱된 데이터를 가져옵니다