내일배움캠프 51일차 TIL : MonsterSpawn 작업

woollim·2024년 12월 4일
0

내일배움캠프TIL

목록 보기
44/65
post-thumbnail

■ 개요

오늘 계획

  • 씬매니저 추가
  • 스테이지 랜덤 생성 상세 구현
    • 스테이지 종류별 데이터베이스 세분화 필요(테이블 정규화)


■ CharacterManager

public class CharacterManager : MonoBehaviour, IManager
{
    public Dictionary<int, IObjectPool<EnemySpawn>> prevEnemyPool; // 이전 스테이지 에너미 오브젝트 풀
    public Player Player { get; set; }
    public GameObject playerPrefab;

    private void Start()
    {
        //Init();
    }

    public void Init()
    {
        playerPrefab = Managers.Resource.LoadAsset<GameObject>("Prefab/PlayerPrefab");

        prevEnemyPool = new Dictionary<int, IObjectPool<EnemySpawn>>();
        Managers.UI.Show<UIHUD>();
    }

    public void SpawnPlayer()
    {
        if (Player != null) Destroy(Player.gameObject);

        Logger.Log(playerPrefab.ToString());
        GameObject player = Instantiate(playerPrefab);
        DontDestroyOnLoad(player);
    }

    /// <summary>
    /// 몬스터를 생성해주는 함수 입니다.
    /// </summary>
    /// <param name="stageName">스테이지 이름</param>
    /// <param name="monsterIDs">몬스터 ID 리스트</param>
    /// <param name="monsterQuantity">몬스터 수 리스트</param>
    public void SpawnMonster(int floor, string stageName, List<int> monsterIDs, List<int> monsterQuantity)
    {
        IObjectPool<EnemySpawn>[] enemyPool; // 에너미 풀 배열(몬스터가 여러 종류 일 수 있으므로)
        Dictionary<int, IObjectPool<EnemySpawn>> curEnemyPool = new Dictionary<int, IObjectPool<EnemySpawn>>(); // 현재 스테이지 에너미 오브젝트 풀
        EnemySpawn monsterPrefab; // 몬스터 프리펩을 담을 임시 그릇
        EnemySpawn enemys; // 풀에서 가져온 에너미 객체를 담을 그릇
        int listCount = monsterIDs.Count;

        //Logger.WarningLog(stageName);

        enemyPool = new IObjectPool<EnemySpawn>[listCount]; // 에너미풀 배열을 리스트 카운트 만큼 생성(몬스터 종류만큼 생성)
        Managers.Game.enemyCount = new Dictionary<int, int>(); // 게임매니저에서 에너미 처치 관리를 할 딕셔너리 몬스터ID가 키값
        for (int i = 0; i < listCount; i++) // 몬스터 종류만큼 반복
        {
                monsterPrefab = Resources.Load<EnemySpawn>(Managers.Data.GameDataBase.MonsterDatas[monsterIDs[i]]._prefabPath); 
                if (monsterPrefab == null)
                {
                    return;
                }
                enemyPool[i] = Managers.Pool.GetPool<EnemySpawn>(monsterPrefab, monsterQuantity[i], monsterQuantity[i]+1);// 풀 생성

            curEnemyPool.Add(monsterIDs[i], enemyPool[i]); // 현재 몬스터 풀정보를 딕셔너리에 추가
            Managers.Game.enemyCount.Add(monsterIDs[i], monsterQuantity[i]);
            for (int j = 0; j < monsterQuantity[i]; j++) // 몬스터 수만큼 반복
            {

                enemys = enemyPool[i].Get(); // 풀에서 에너미 가져오기
                enemys.SetPool(enemyPool[i]); // 해당 에너미의 풀 지정(저장)

                //TODO : Map 넓이에 비례하게 변경
                enemys.Init(monsterIDs[i], new Vector3(Random.Range(-5, 5), 0, Random.Range(-5, 5))); // 위치 초기화
            }
        }

        prevEnemyPool.Clear();
        foreach (var pair in curEnemyPool)
        {
            prevEnemyPool.Add(pair.Key, pair.Value);
        } // 이전 에너미 풀을 현재 에너미 풀로 초기화
    }
}

0개의 댓글