오늘은 데이터 연결 부분을 공부했다.
구글 시트에서 json으로 변환하는 컨버터가 있어 편하게 바꾸어주고,
엑셀에서 만들어둔 데이터를 클래스로 만들어주자.
[System.Serializable]
public class MonsterSpawnData
{
public string MonsterId1;
public int MonsterCount1;
public string MonsterId2;
public int MonsterCount2;
public string MonsterId3;
public int MonsterCount3;
}
[System.Serializable]
public class DungeonData
{
public string StageId;
public string ObjectName;
public List<MonsterSpawnData> MonsterSpawn;
}
[System.Serializable]
public class DungeonDataList : DataBaseList<string, DungeonData, DungeonData>
{
public List<DungeonData> Dungeon;
public override void SetData(List<DungeonData> metaDataList)
{
datas = new Dictionary<string, DungeonData>(metaDataList.Count); //딕셔너리 초기용량 지정
for(int i = 0; i < metaDataList.Count; i++)
{
datas.Add(metaDataList[i].StageId, metaDataList[i]); //외부에서 생성된 객체를 사용하도록
}
}
}
던전에서 관리해줄 데이터들을 클래스로 만들어주었다.
리스트 보다 딕셔너리를 사용하면 키값으로 보다 찾기 편하고 빠르게 가져올 수 있으니 DataBaseList를 상속받아 딕셔너리로 만들어주었다.
던전매니저를 통해 불러온 데이터에 있는 맵과 몬스터를 생성해준다.
using UnityEngine;
public class DungeonManager : MonoBehaviour
{
public PuzzleManager PuzzleManager { get; private set; }
private string curStageId;
// 매니저 파괴
private void OnDestroy()
{
if (PuzzleManager != null) Destroy(PuzzleManager.gameObject);
PuzzleManager = null;
GameManager.Instance.ExitDungeon();
}
public void InitializeDungeon(string stageId)
{
PuzzleManager = new GameObject("PuzzleManager").AddComponent<PuzzleManager>();
curStageId = stageId;
//LoadDungeonData();
SpawnStageObjects(curStageId);
Debug.Log("현재 스테이지: " + curStageId);
}
private void SpawnStageObjects(string stageId)
{
if (DataManager.Instance.DungeonDB == null | !DataManager.Instance.DungeonDB.datas.ContainsKey(stageId))
{
Debug.LogError("스테이지 id를 찾을 수 없음.");
return;
}
DungeonData stageData = DataManager.Instance.DungeonDB.LoadData(stageId);
GameObject prefab = ResourceManager.Instance.LoadAsset<GameObject>(stageId, eAssetType.Prefab, eCategoryType.Map);
if (prefab == null)
{
Debug.LogError("맵 프리팹을 못찾음"); return;
}
GameObject instance = Instantiate(prefab, transform);
MapData mapData = instance.GetComponent<MapData>();
if (mapData == null)
{
Debug.LogError("맵 데이터 컴포 없음"); return;
}
mapData.SetMapData(stageData);
if (stageData.MonsterSpawn != null)
{
foreach (MonsterSpawnData monsterSpawn in stageData.MonsterSpawn)
{
SpawnMonster(monsterSpawn.MonsterId1, monsterSpawn.MonsterCount1, mapData);
SpawnMonster(monsterSpawn.MonsterId2, monsterSpawn.MonsterCount2, mapData);
SpawnMonster(monsterSpawn.MonsterId3, monsterSpawn.MonsterCount3, mapData);
//GameObject monsterPrefab = ResourceManager.Instance.LoadAsset<GameObject>(monsterSpawn.MonsterId1, eAssetType.Prefab);
//if (monsterPrefab == null) Debug.LogError("몬스터 프리팹 못찾음"); continue;
//for(int i = 0; i < monsterSpawn.MonsterCount1; i++)
//{
// Transform spawnPoint = mapData.GetMonsterSpawnPoint();
// if (spawnPoint == null) Debug.Log("스폰 포인트 정해주기"); break;
// Instantiate(monsterPrefab, spawnPoint.position, Quaternion.identity);
//}
}
}
}
private void SpawnMonster(string monsterId, int count, MapData mapData)
{
if (string.IsNullOrEmpty(monsterId) || count <= 0) return; //빈 문자열 또는 0일 경우 스폰하지 않음
GameObject monsterPrefab = ResourceManager.Instance.LoadAsset<GameObject>(monsterId, eAssetType.Prefab);
if (monsterPrefab == null)
{
Debug.LogError("몬스터 프리팹 못찾음");
return;
}
for (int i = 0; i < count; i++)
{
Transform spawnPoint = mapData.GetMonsterSpawnPoint();
if (spawnPoint == null)
{
Debug.LogWarning("스폰 포인트 못찾음 지정 확인");
return;
}
Instantiate(monsterPrefab, spawnPoint.position, Quaternion.identity);
}
}
public void StageClear()
{
Cursor.lockState = CursorLockMode.None;
UIManager.Instance.Show<UIPopupStageClear>();
}
}
매니저에서 스폰해주고, mapdata에서 몬스터의 transform를 지정해주고 Transform을 반환받아 그 위치에 스폰해주도록 하였다.