최종 실습: 탑다운 생존 게임
24강. 최종 실습: 탑다운 생존 게임
1. 이번 강의에서 해결할 문제
각 기능은 따로 동작하지만 적 사망 점수가 오르지 않거나 게임 오버 뒤에도 생성과 입력이 계속됩니다. 이벤트 경계를 연결하고 정상·경계 상황을 테스트해 플레이 가능한 한 판을 완성합니다.
2. 학습 목표
3. 핵심 개념
최종 통합의 핵심은 클래스 수가 아니라 의존 방향입니다.
Enhanced Input → PlayerController → SurvivalCharacter.Move / PerformAttack
PerformAttack → ApplyDamage → HealthComponent
Enemy HealthComponent.OnDeath → EnemyBase → GameSubsystem.AddScore
Player HealthComponent.OnDeath → GameSubsystem.EndGame
GameSubsystem Delegate → HUD 갱신 / Controller 입력 차단 / Spawner Timer 중단
EnemySpawner → EnemyDataAsset → EnemyBase 초기화
Tick은 이동을 수행하는 엔진 Movement 경로에 맡기고, AI 판단과 생성은 Timer, 재사용 체력은 Component, 한 판의 공유 상태는 GameInstance Subsystem을 사용했습니다.
4. 단계별 실습
4-1. 적 사망과 점수 연결
파일 경로: Source/TopDownSurvival/Enemies/EnemyBase.h · 추가
UFUNCTION()
void HandleDeath();
파일 경로: Source/TopDownSurvival/Enemies/EnemyBase.cpp
#include "Systems/SurvivalGameSubsystem.h"
void AEnemyBase::BeginPlay()
{
Super::BeginPlay();
HealthComponent->OnDeath.AddDynamic(this, &AEnemyBase::HandleDeath);
TargetPawn = UGameplayStatics::GetPlayerPawn(this, 0);
GetWorldTimerManager().SetTimer(
ThinkTimerHandle, this, &AEnemyBase::Think, ThinkInterval, true);
}
void AEnemyBase::HandleDeath()
{
GetWorldTimerManager().ClearTimer(ThinkTimerHandle);
if (AAIController* AI = Cast<AAIController>(GetController()))
{
AI->StopMovement();
}
if (USurvivalGameSubsystem* Game =
GetGameInstance()->GetSubsystem<USurvivalGameSubsystem>())
{
Game->AddScore(EnemyData ? EnemyData->ScoreValue : 0);
}
SetActorEnableCollision(false);
Destroy();
}
Pool을 실제 사용한다면 Destroy 대신 EnemyPool.Release를 호출하되 점수 이벤트와 AI·Timer 정리는 동일하게 유지합니다.
4-2. 플레이어 사망과 게임 오버 연결
파일 경로: Source/TopDownSurvival/Characters/SurvivalCharacter.h
protected:
virtual void BeginPlay() override;
private:
UFUNCTION()
void HandleDeath();
파일 경로: Source/TopDownSurvival/Characters/SurvivalCharacter.cpp
#include "Systems/SurvivalGameSubsystem.h"
void ASurvivalCharacter::BeginPlay()
{
Super::BeginPlay();
HealthComponent->OnDeath.AddDynamic(this, &ASurvivalCharacter::HandleDeath);
}
void ASurvivalCharacter::HandleDeath()
{
GetCharacterMovement()->DisableMovement();
if (USurvivalGameSubsystem* Game =
GetGameInstance()->GetSubsystem<USurvivalGameSubsystem>())
{
Game->EndGame();
}
}
PlayerController는 19강의 HandleGameOver에서 SetIgnoreMoveInput(true)를 호출하고 HUD Game Over Panel을 표시합니다. HandleAttack 시작에도 Game->IsGameOver 검사를 추가해 공격을 막습니다.
4-3. 새 게임 초기화와 Spawner 중단
파일 경로: Source/TopDownSurvival/Game/SurvivalGameMode.cpp
#include "Game/SurvivalGameMode.h"
#include "Systems/SurvivalGameSubsystem.h"
void ASurvivalGameMode::BeginPlay()
{
Super::BeginPlay();
if (USurvivalGameSubsystem* Game =
GetGameInstance()->GetSubsystem<USurvivalGameSubsystem>())
{
Game->ResetRun();
}
}
Spawner의 SpawnEnemy 시작에서 IsGameOver를 검사하는 21강 코드를 유지합니다. 더 즉각적인 중단이 필요하면 BeginPlay에서 OnGameOver Delegate를 구독하고 Handler에서 ClearTimer합니다.
4-4. Blueprint와 레벨 연결
- BP_SurvivalCharacter에 Capsule 또는 기본 Mesh와 HealthComponent 기본값을 확인합니다.
- BP_SurvivalPlayerController에 IMC_Player, IA_Move, IA_Attack, WBP_SurvivalHUD를 연결합니다.
- BP_EnemyBase와 두 EnemyDataAsset을 연결합니다.
- BP_EnemySpawner의 EnemyTypes와 생성 설정을 연결합니다.
- SurvivalGameMode를 프로젝트 또는 World 기본 GameMode로 지정합니다.
- PlayerStart, 바닥, 장애물, NavMeshBoundsVolume과 Spawner를 레벨에 배치합니다.
4-5. PowerShell 전체 빌드
실행 위치: C:\UnrealProjects\TopDownSurvival
Set-Location C:\UnrealProjects\TopDownSurvival
$ProjectFile = (Resolve-Path .\TopDownSurvival.uproject).Path
$EngineRoot = "C:\Program Files\Epic Games\UE_5.x"
& "$EngineRoot\Engine\Build\BatchFiles\Build.bat" TopDownSurvivalEditor Win64 Development $ProjectFile -WaitMutex
실제 엔진 폴더 이름으로 UE_5.x를 교체합니다. Editor를 닫은 전체 빌드와 Editor 실행 테스트를 모두 통과해야 완료입니다.
5. 코드가 동작하는 이유
ApplyDamage는 HealthComponent로 들어가고 Component는 체력 변경과 사망 사실만 Broadcast합니다. 적은 자신의 사망을 점수 규칙에 연결하고 플레이어는 게임 오버에 연결합니다. GameSubsystem은 상태 변경을 UI, 입력과 생성 시스템에 알리므로 서로 구체 클래스를 직접 찾는 의존이 줄어듭니다.
구조 선택 근거:
| 구조 | 선택한 곳 | 이유 |
|---|---|---|
| Tick | 사용자 코드에서는 기본 비활성 | 매 프레임 직접 갱신할 규칙이 없음 |
| Timer | 적 AI 판단, 생성, 공격 쿨다운 | 일정 간격 작업의 의도가 명확함 |
| Component | 체력 | 플레이어와 적에서 재사용 |
| Subsystem | 점수, 게임 오버 | 한 Actor보다 긴 게임 세션 상태 |
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
최종 실습: 탑다운 생존 게임 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.