■ 개요
○ 오늘 계획
- 씬매니저 추가
- 스테이지 랜덤 생성 상세 구현
- 스테이지 종류별 데이터베이스 세분화 필요(테이블 정규화)
■ 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);
} // 이전 에너미 풀을 현재 에너미 풀로 초기화
}
}