Unity_개발일지_41

홍신영·2024년 12월 17일
0

Unity

목록 보기
43/61

오늘은 데이터 연결 부분을 공부했다.
구글 시트에서 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을 반환받아 그 위치에 스폰해주도록 하였다.

profile
게임 클라이언트 개발자

0개의 댓글