순찰 AI
18강. 순찰 AI
1. 이번 강의에서 해결할 문제
현재 위치를 중심으로 계속 랜덤 순찰해 적이 원래 구역에서 멀리 떠납니다. HomeLocation을 기준으로 목적지를 선택하고 도착 후 잠시 대기합니다.
2. 학습 목표
3. 핵심 개념
순찰은 목표 위치 선택, 이동, 도착, 대기의 반복입니다. 위치 선택과 이동 성공 여부를 분리하면 NavMesh 실패를 다룰 수 있습니다.
현재 위치를 기준으로 랜덤 지점을 계속 고르면 Random Walk가 되어 장기적으로 멀어질 수 있습니다. 스폰 또는 배치 위치인 HomeLocation을 중심으로 반경을 제한합니다.
4. 단계별 실습
Blackboard 작업
BB_EnemyCombat에 HomeLocation Vector Key를 추가합니다.
C++ · 파일 경로: Source/TopDownSurvival/AI/MathAIController.cpp · OnPossess 추가
void AMathAIController::OnPossess(APawn* InPawn)
{
Super::OnPossess(InPawn);
if (!BehaviorTreeAsset || !RunBehaviorTree(BehaviorTreeAsset))
{
return;
}
if (UBlackboardComponent* Blackboard = GetBlackboardComponent())
{
Blackboard->SetValueAsVector(
TEXT("HomeLocation"), InPawn->GetActorLocation());
Blackboard->SetValueAsEnum(
TEXT("AIState"), static_cast<uint8>(EEnemyAIState::Patrol));
}
}
C++ · 파일 경로: Source/TopDownSurvival/AI/Tasks/BTTask_FindPatrolLocation.cpp · 기준 변경
UBlackboardComponent* Blackboard = OwnerComp.GetBlackboardComponent();
const FVector Home = Blackboard->GetValueAsVector(TEXT("HomeLocation"));
FNavLocation Location;
if (!Navigation->GetRandomReachablePointInRadius(
Home, PatrolRadius, Location))
{
return EBTNodeResult::Failed;
}
Blackboard->SetValueAsVector(
PatrolLocationKey.SelectedKeyName, Location.Location);
return EBTNodeResult::Succeeded;
Behavior Tree 작업
Patrol Sequence를 다음 순서로 구성합니다.
- Decorator: AIState == Patrol
- Find Reachable Patrol Location
- Move To: PatrolLocation, Acceptable Radius 60
- Wait: 1.0~2.5초 Random Deviation
Decorator의 Observer Aborts를 Self로 설정하면 상태가 Chase로 바뀔 때 순찰 Branch를 중단할 수 있습니다. 세부 옵션 이름은 UE 버전에 따라 다를 수 있습니다.
5. 코드와 수학·AI가 동작하는 이유
Home을 고정 중심으로 사용하면 각 목적지가 같은 순찰 구역 안에 남습니다. Navigation이 반환한 도달 가능 위치만 Blackboard에 기록하고 MoveTo가 비동기로 경로를 수행합니다. Wait는 이동 완료 뒤 즉시 다음 경로를 요청하는 부자연스러움을 줄입니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
순찰 AI 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.