중간 발표 피드백을 토대로 데이터 로드 방법을 변경했다.
1. 각각의 스크립트에서 관리하지 않고 하나의 DataManager에서 로드하여 관리
2. SO 사용하지 않고 불러온 json 데이터 바로 사용
3. 여러 파일(namespace) 분리하지 않고 하나의 파일에서 sheet(class)를 분리하여 테이블 관리
WaveData는 하나의 테이블로 병합했으면 좋겠다고 하셔서 idx를 1000번대로 만들어 식별하도록 만들었다.
처음에 StageId와 WaveIdx 2개를 기반으로 찾으려고 하니 StageId가 중복되어 Dictionary key 값을 새로 만들어줘야 하는 문제가 있었다. 그래서 그냥 WavdIdx를 1000번대로 만들어 데이터를 가져오고 HumanSpawner 측에서 계산하여 식별하도록했다.
Awake에서 필요한 데이터를 로드하고, Stage가 선택되어 MainScene으로 넘어가 Human이 생성될 때 로드된 데이터 기반으로 스탯을 초기화한다. WaveData는 웨이브가 실행될 때 HumanSpawner에서 데이터를 가져오고, 해당 데이터를 기반으로 인간을 스폰한다.
DataManager
public class DataManager : SingletonBase<DataManager>
{
private List<Human_Data> _humanDataList;
private Dictionary<int, Wave_Data> _waveDataDictionary;
protected override void Awake()
{
LoadHumanData();
LoadWaveData();
}
private void LoadHumanData()
{
_humanDataList = Human_Data.Human_DataList;
if (_humanDataList.Count <= 0)
{
_humanDataList = Human_Data.GetList();
}
if (_humanDataList.Count <= 0)
{
Debug.LogAssertion($"Human data not Loaded");
}
}
public Human_Data GetHumanByIndex(int idx)
{
if (_humanDataList.Count <= 0)
{
LoadHumanData();
}
for (int i = 0; i < _humanDataList.Count; i++)
{
if (_humanDataList[i].id == idx)
return _humanDataList[i];
}
return null;
}
private void LoadWaveData()
{
_waveDataDictionary = Wave_Data.Wave_DataMap;
if (_waveDataDictionary.Count <= 0)
{
_waveDataDictionary = Wave_Data.GetDictionary();
}
if (_waveDataDictionary.Count <= 0)
{
Debug.LogAssertion($"Wave data not Loaded");
}
}
public Wave_Data GetWaveByIndex(int waveIdx)
{
if ((_waveDataDictionary).Count <= 0)
{
LoadWaveData();
}
if (_waveDataDictionary.TryGetValue(waveIdx, out var waveData))
{
return waveData;
}
Debug.LogAssertion($"Wave data not Found: {waveIdx}");
return null;
}
}
Human
public class Human : MonoBehaviour
{
private Human_Data _humanData;
protected virtual void Awake()
{
// 데이터 세팅
_humanData = DataManager.Instance.GetHumanByIndex(id);
}
}
HumanSpawner
public class HumanSpawner : MonoBehaviour
{
private IEnumerator SpawnHumansCoroutine(int waveIdx)
{
if (_curWaveIdx == GetLastWaveIdx(_curStageIdx)) // 현재 웨이브가 마지막 웨이브면
{
HumanManager.Instance.isLastWave = true;
}
DataTable.Wave_Data waveData = DataManager.Instance.GetWaveByIndex(_curWaveIdx); // 현재 웨이브 데이터 정보 가져오기
if (waveData == null)
{
Debug.LogError($"Wave data is missing: {_curWaveIdx}");
yield break;
}
for (int i = 0; i < waveData.humanId.Count; i++) // 현재 웨이브의 인간 종류만큼 반복
{
for (int j = 0; j < waveData.count[i]; j++) // 해당 종류 인원수 만큼 반복
{
SpawnHuman(waveData.waveIdx, waveData.humanId[i]);
yield return _spawnDelay;
}
}
}
}'내일배움캠프 > TIL' 카테고리의 다른 글
| [내배캠][Unity6기][TIL] 힐러 타입 인간 추가 (0) | 2025.01.03 |
|---|---|
| [내배캠][Unity6기][TIL] 데이터 로드 리팩토링 (2) (0) | 2024.12.31 |
| [내배캠][Unity6기][TIL] 동적 생성 메서드 경로 설정 리팩토링 (0) | 2024.12.27 |
| [내배캠][Unity6기][TIL] 게임 로직 리팩토링 (0) | 2024.12.26 |
| [내배캠][Unity6기][TIL] 중간 발표 피드백 (0) | 2024.12.23 |