본문으로 건너뛰기
게임 수학 · 게임 AI 기초집LESSON 24

최종 실습: 탑다운 적 추적·전투 AI

난이도초급
예상 시간90분
선수지식1~23강 완료

24강. 최종 실습: 탑다운 적 추적·전투 AI

1. 이번 강의에서 해결할 문제​

순찰, 추적과 공격이 각각 동작하지만 경계 조건에서 잘못 전환되거나 적이 많을 때 판단이 한 프레임에 몰립니다. 모든 수학·AI 시스템을 하나의 검증 가능한 전투 AI로 통합합니다.

2. 학습 목표​

3. 핵심 개념​

최종 AI 흐름
BT Service (0.25s ± 분산)
└─ AIController
├─ 거리 제곱 → 추적·공격 후보
├─ 내적 → 시야각
├─ Line Trace → 장애물 차폐
├─ State 결정 → Blackboard
└─ LastKnownLocation / LastSeenTime

Behavior Tree Selector
├─ Attack: 시야 + 공격 거리 + 쿨다운
├─ Chase: 목표 또는 마지막 위치로 MoveTo
└─ Patrol: Home 주변 NavMesh 위치 → MoveTo → Wait

Enemy Character
└─ 몸, CharacterMovement, 회전 보간, 공격 실행, HealthComponent

멀티플레이에서는 AI와 피해 판단의 서버 권한, 상태 복제와 시각 효과 RPC를 별도로 설계해야 합니다. 이 과정은 싱글플레이 구조와 성능 근거에 집중합니다.

4. 단계별 실습​

4-1. Controller의 최종 공격 조건​

C++ · 파일 경로: Source/TopDownSurvival/AI/MathAIController.cpp

MathAIController.cpp · CanAttackTarget
bool AMathAIController::CanAttackTarget(AActor* Target) const
{
const APawn* Enemy = GetPawn();
if (!Enemy || !IsValid(Target) || !AIConfig)
{
return false;
}

const bool bInRange = UGameMathLibrary::IsWithinRange2D(
Enemy->GetActorLocation(),
Target->GetActorLocation(),
AIConfig->AttackDistance);

return bInRange && HasClearSight(Target);
}

4-2. 설정 적용과 AI별 판단 주기​

19강에서는 Behavior Tree Service를 사용했습니다. 최종 프로젝트에서 적마다 다른 DataAsset 주기를 적용하려면 공유될 수 있는 BT Node 멤버를 바꾸지 않고 AIController 인스턴스의 Timer를 사용합니다. BT에서는 Update Combat Context Service를 제거하고 Blackboard Observer가 Timer 갱신에 반응하게 합니다.

C++ · 파일 경로: Source/TopDownSurvival/AI/MathAIController.cpp

MathAIController.cpp · StartDecisionLoop
void AMathAIController::StartDecisionLoop()
{
if (!AIConfig)
{
return;
}

const float Interval = FMath::Max(0.05f, AIConfig->DecisionInterval);
const float InitialDelay = FMath::FRandRange(0.0f, Interval);
GetWorldTimerManager().SetTimer(
DecisionTimerHandle,
this,
&AMathAIController::RefreshCombatContext,
Interval,
true,
InitialDelay);
}

Controller Header에 FTimerHandle DecisionTimerHandle을 추가하고 OnPossess에서 DataAsset을 적용한 뒤 StartDecisionLoop를 호출합니다. OnUnPossess와 EndPlay에서 Timer를 해제합니다. InitialDelay를 분산해 여러 적의 첫 Trace가 같은 프레임에 몰리지 않게 합니다.

4-3. C++와 Blueprint·Editor 연결​

C++ 책임

  • UGameMathLibrary: 방향, 거리, 내적 시야 조건
  • AMathAIController: 목표 감지, 상태, Blackboard 갱신
  • AMathAIEnemyCharacter: Movement, 보간, 공격과 쿨다운
  • UEnemyAIConfigData: 튜닝 값
  • BT Task·Service: 작은 행동과 제한된 판단 갱신

Blueprint·Editor 작업

  1. BB_EnemyCombat에 TargetActor, HomeLocation, PatrolLocation, HasLineOfSight, DistanceToTarget, LastKnownLocation, LastSeenTime, AIState를 확인합니다.
  2. BT_EnemyCombat의 Branch 순서를 Attack → Chase → Patrol로 둡니다.
  3. 각 Branch에 AIState 또는 Blackboard Decorator와 Observer Abort를 설정합니다.
  4. BP_MathAIController에 BT_EnemyCombat과 DA_AI_Normal을 연결합니다.
  5. BP_MathAIEnemy의 AI Controller Class와 Auto Possess AI를 확인합니다.
  6. NavMeshBoundsVolume이 순찰·추적 영역과 장애물을 덮는지 P로 확인합니다.
  7. Primitive Mesh만 사용해 플레이어, 적, 벽과 순찰 공간을 배치합니다.

4-4. PowerShell 전체 빌드​

실행 위치: C:\UnrealProjects\TopDownSurvival

PowerShell
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를 닫은 빌드와 PIE 실행을 모두 확인합니다.

5. 코드와 수학·AI가 동작하는 이유​

벡터 차이는 목표 방향, 거리 제곱은 범위 후보, 내적은 시야각, Line Trace는 차폐를 판정합니다. AIController가 이 결과를 Blackboard와 상태로 바꾸고 Behavior Tree가 행동 우선순위를 선택합니다. Character는 MoveTo가 제어하는 몸과 공격 실행만 담당합니다.

구조사용 위치선택 이유
Tick목표가 있을 때 회전 보간만매 프레임 필요한 시각 변화
BT Service 또는 Timer감지·상태 갱신0.2~0.5초로 충분한 판단
NavMesh·MoveTo순찰·추적 이동장애물 경로와 도착 관리
Blackboard목표·위치·판단 결과Task와 Decorator의 공통 데이터
DataAsset거리·속도·쿨다운재컴파일 없는 튜닝

6. 자주 하는 실수와 해결법​

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

MINI QUIZ

최종 실습: 탑다운 적 추적·전투 AI 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“최종 실습: 탑다운 적 추적·전투 AI”에서 혼동하기 쉬운 개념을 올바르게 연결한 것은 무엇인가요?
  2. 문제 2‘멀티플레이 복제를 바로 추가’ 상태에 관한 “최종 실습: 탑다운 적 추적·전투 AI” 본문의 설명으로 가장 알맞은 것은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

24강. 최종 실습: 탑다운 적 추적·전투 AI 미완료 상태