게임의 전체 흐름과 글로벌 이벤트를 관장합니다. GameManager는 무엇을 할지 결정하고, 나머지 매니저들에게 어떻게 할지 지시합니다.
EGameState (준비, 전투, 게임오버)를 관리하며, BeginPreparationPhase(), BeginCombatPhase()를 호출하여 게임의 메인 루프를 실행합니다.bIsStimUsedThisWave)을 관리합니다. AStimInjector는 GameManager->UseStim()을 호출할 뿐, 실제 이펙트 적용(EffectManager->ApplyEffect)과 OnStimStateChanged Broadcast는 GameManager가 직접 처리합니다.StartGame() 시 ManagedLight, SpecialMesh 태그를 가진 액터/컴포넌트를 미리 찾아 저장해 둡니다. StartBlackoutEvent()가 발동되면, 저장된 배열을 순회하며 라이트를 끄고 머티리얼을 변경하며, 모든 ADoorControlPanel의 UnlockAllDoors()를 강제로 호출합니다.UpgradeAllDoorBatteries() 호출을 받으면, AllControlPanelsInLevel 배열을 순회하며 각 패널의 ApplyBatteryUpgrade()를 실행시켜 배터리 최대 용량을 일괄 적용합니다.EnemySpawnManager의 OnEnemyDied를 구독하여 CumulativeKills 누적 킬 수를 기록합니다.웨이브의 구성, 보상 지급, 아이템/몬스터 스폰 요청을 담당합니다.
StartWave()가 호출되면, DT_WaveConfig (데이터 테이블)에서 현재 웨이브의 FWaveDataInfo를 찾아 CurrentWaveDataCache 변수에 저장합니다.MonsterSpawnList를 순회하여 TotalMonsterCount (예: 20마리)를 계산합니다.ItemSpawnManager->GenerateDropQueue()를 호출하며, (1)번의 WaveData와 (2)번의 TotalMonsterCount를 전달합니다.EnemySpawnManager->RequestSpawn()을 MonsterSpawnList 만큼 호출하여 몬스터 스폰을 요청합니다.EnemiesRemainingInWave가 0이 되면 OnWaveCleared()가 실행됩니다. 이 함수는 플레이어의 UInventoryComponent를 찾아 CurrentWaveDataCache에 저장된 WaveClearRewardBioCore 만큼 AddBioCoreCount()를 호출합니다.GameManager->BeginPreparationPhase()를 호출하여 사이클을 완료합니다.
WaveManager의 스폰 요청을 받아, 성능 저하 없이 자연스럽게 몬스터를 월드에 배치합니다.