기존 디자인
[게임 타이틀]
[이름 생성]
변경 디자인
[게임 타이틀]
[이름 생성]
private void OnStartButtonClick()
{
Managers.Sound.PlaySFX(SFX.UI_ButtonClick);
mainMenuGroup.interactable = false;
if(Managers.SaveLoad.FileExists())
{ // 저장파일이 있으면, 게임시작
mainMenuGroup.DOFade(0f, fadeOutDuration)
.OnComplete(() => OnGameStartRequested?.Invoke());
}
else
{ // 없으면 로그인 화면으로
mainMenuGroup.DOFade(0f, fadeOutDuration)
.OnComplete(() => OnLoginRequested?.Invoke());
}
}
/// <summary>
/// 스테이지 ID 에 맞는 몬스터를 소환해주는 함수 입니다
/// </summary>
public void EnterStageMonsterSpawn()
{
switch (StageType)
{
case StageType.Boss:
Managers.Character.SpawnBossMonster();
break;
case StageType.Normal:
Managers.Character.SpawnNormalMonster();
break;
}
}
/// <summary>
/// 보스 몬스터를 생성해주는 함수 입니다.
/// </summary>
public void SpawnBossMonster()
{
BossStageData bossStage = Managers.Data.GameDataBase.BossStageDatas[Managers.Stage.StageID];
int listCount = bossStage._monsterIDs.Count; // 데이터테이블 내 몬스터 종류 수
// 현재 스테이지의 몬스터 종류수 만큼 반복
for (int i = 0; i < listCount; i++)
{
InitMonsterPool(bossStage._monsterIDs[i], bossStage._monsterQuantity[i]);
}
}
/// <summary>
/// 노말 몬스터를 생성해주는 함수 입니다.
/// </summary>
public void SpawnNormalMonster()
{
NormalStageData normalStage = Managers.Data.GameDataBase.NormalStageDatas[Managers.Stage.StageID];
int currentPhase = Managers.Game.CurrentMonsterPhase; // 데이터테이블 내 몬스터 종류 수
Logger.Log($"현재 페이즈 : {currentPhase}, 맥스 페이즈 : {normalStage._phaseCount}");
if (currentPhase < normalStage._phaseCount)
{
InitMonsterPool(normalStage._monsterIDs[currentPhase], normalStage._monsterQuantity[currentPhase]);
}
}
/// <summary>
/// 몬스터 종류별 에너미 풀을 초기화 하는 함수 입니다.
/// </summary>
/// <param name="monsterID">몬스터 ID</param>
/// <param name="quantity">몬스터 수</param>
private void InitMonsterPool(int monsterID, int quantity)
{
var monsterPrefab = Managers.Resource.LoadAsset<Enemy>(Managers.Data.GameDataBase.MonsterDatas[monsterID]._prefabPath);
if (monsterPrefab == null) return;
if(!enemyPool.ContainsKey(monsterID))
{
enemyPool.Add(monsterID, Managers.Pool.GetPool<Enemy>(monsterPrefab, quantity));
}
Managers.Game.AddEnemyCount(monsterID, quantity);
for (int j = 0; j < quantity; j++)
{
var enemy = enemyPool[monsterID].Get(); // 에너미 풀에서 에너미 가져옴
enemy.SetMonster(monsterID);
}
}
public class GameManager : MonoBehaviour, IManager
{
private Dictionary<int, int> stageEnemyCount; // 해당 스테이지에 있는 에너미 카운트
public int CurrentMonsterPhase { get; private set; } // 노말 스테이지 몬스터 현재 페이즈
public int LastSpawnMonsterID { get; private set; } // 마지막에 소환된 몬스터의 ID
public void SubEnemyCount(int monsterID, Enemy enemy)
{
// 딕셔너리에서 monsterID를 키로 해당되는 밸류(몬스터 수)를 찾습니다.
if (!stageEnemyCount.TryGetValue(monsterID, out int monsterCount))
return;
TopReputeScore += enemy.Stat.ReputeNumber;
stageEnemyCount[monsterID]--;
if (Managers.Stage.StageType == StageType.Normal && LastSpawnMonsterID != monsterID)
{
// 마지막 페이즈가 아니고, 페이즈 별 몬스터 절반이 죽었을 경우에
if (CurrentMonsterPhase < Managers.Data.GameDataBase.NormalStageDatas[Managers.Stage.StageID]._phaseCount - 1 && stageEnemyCount[monsterID] < Managers.Data.GameDataBase.NormalStageDatas[Managers.Stage.StageID]._monsterQuantity[CurrentMonsterPhase] / 2)
{
CurrentMonsterPhase++; // 현재 페이즈 증가
LastSpawnMonsterID = monsterID;
// 다음 페이즈 몬스터 소환
Managers.Character.SpawnNormalMonster();
Logger.Log($"{CurrentMonsterPhase}페이즈 시작");
}
}
if (stageEnemyCount[monsterID] <= 0) // 다 죽였다면
{
stageEnemyCount.Remove(monsterID);
if (stageEnemyCount.Count == 0) // 모든 종류의 몬스터가 죽었다면
{
StageClear(enemy.gameObject.transform.position);
}
}
}
}