PART 1 - 강의 2/3

AIPerceptionComponent 기초

AIPerceptionComponent의 설정, SenseConfig 구성, Stimulus 처리 기초를 학습합니다

01

AIPerceptionComponent 설정

AI에 감각 기능을 부여하는 컴포넌트

UAIPerceptionComponent는 AIController에 부착되어 시각, 청각, 데미지 등 다양한 감각을 처리합니다. SenseConfig를 통해 어떤 감각을 사용할지 설정합니다.

C++// AIController 생성자에서 Perception 설정 AMyAIController::AMyAIController() { PerceptionComponent = CreateDefaultSubobject<UAIPerceptionComponent>( TEXT("PerceptionComp")); // 시각 감각 설정 FAISenseAffiliationFilter AffiliationFilter; AffiliationFilter.bDetectEnemies = true; AffiliationFilter.bDetectNeutrals = false; AffiliationFilter.bDetectFriendlies = false; UAISenseConfig_Sight* SightConfig = NewObject<UAISenseConfig_Sight>(); SightConfig->SightRadius = 1500.f; SightConfig->LoseSightRadius = 2000.f; SightConfig->PeripheralVisionAngleDegrees = 60.f; SightConfig->DetectionByAffiliation = AffiliationFilter; PerceptionComponent->ConfigureSense(*SightConfig); PerceptionComponent->SetDominantSense(UAISense_Sight::StaticClass()); }

LoseSightRadius는 SightRadius보다 크게 설정하세요. 이 차이가 타겟을 감지한 후 놓치기까지의 히스테리시스 구간입니다.

02

Stimulus와 이벤트 처리

감각 자극을 수신하고 반응하는 방법

Perception이 감지한 자극은 OnTargetPerceptionUpdated 델리게이트를 통해 수신합니다. FAIStimulus 구조체에 감각 유형, 위치, 강도 등의 정보가 담깁니다.

C++// 이벤트 바인딩 PerceptionComponent->OnTargetPerceptionUpdated.AddDynamic( this, &AMyAIController::OnPerceptionUpdated); void AMyAIController::OnPerceptionUpdated( AActor* Actor, FAIStimulus Stimulus) { if (Stimulus.WasSuccessfullySensed()) { // 타겟 감지됨 - Blackboard에 기록 GetBlackboardComponent()->SetValueAsObject( TEXT("TargetActor"), Actor); } else { // 타겟 상실 - 마지막 위치 기록 GetBlackboardComponent()->SetValueAsVector( TEXT("LastKnownLocation"), Stimulus.StimulusLocation); } }
03

다중 감각 설정

시각과 청각을 동시에 사용하는 AI

실전 AI는 여러 감각을 복합적으로 사용합니다. 시각으로 적을 직접 확인하고, 청각으로 소리 방향을 감지하여 탐색 행동을 유발할 수 있습니다.

C++// 시각 + 청각 복합 설정 AMyAIController::AMyAIController() { PerceptionComponent = CreateDefaultSubobject<UAIPerceptionComponent>( TEXT("PerceptionComp")); // 시각 설정 UAISenseConfig_Sight* SightConfig = NewObject<UAISenseConfig_Sight>(); SightConfig->SightRadius = 1500.f; SightConfig->LoseSightRadius = 2000.f; SightConfig->PeripheralVisionAngleDegrees = 60.f; SightConfig->SetMaxAge(5.f); PerceptionComponent->ConfigureSense(*SightConfig); // 청각 설정 UAISenseConfig_Hearing* HearingConfig = NewObject<UAISenseConfig_Hearing>(); HearingConfig->HearingRange = 3000.f; HearingConfig->SetMaxAge(3.f); HearingConfig->DetectionByAffiliation.bDetectEnemies = true; PerceptionComponent->ConfigureSense(*HearingConfig); // 시각을 주요 감각으로 설정 PerceptionComponent->SetDominantSense(UAISense_Sight::StaticClass()); } // 소리 이벤트 발생 (총소리, 발소리 등) UAISense_Hearing::ReportNoiseEvent( GetWorld(), NoiseLocation, 1.0f, // Loudness NoiseMaker, 0.f, // MaxRange (0 = HearingRange 사용) FName("Gunshot") // Tag );
MaxAge 활용

SetMaxAge()는 감각 자극의 유효 시간입니다. 시각은 5초, 청각은 3초로 설정하면 적을 놓친 후 일정 시간만 기억하고 이후 잊어버리는 자연스러운 행동을 구현할 수 있습니다.

04

Perception 디버깅

감각 시스템의 시각적 디버깅

AI Perception 시스템은 Gameplay DebuggerAI Debug Draw를 통해 시각적으로 디버깅할 수 있습니다. 감지 범위, 감지된 타겟, 자극 위치를 실시간으로 확인하세요.

C++// AI Debug 시각화 활성화 // 콘솔 명령어 // ai.debug.Perception 1 - Perception 디버그 표시 // ai.debug.Sight 1 - 시야 범위 표시 // ai.debug.Hearing 1 - 청각 범위 표시 // 코드에서 감지 상태 확인 void AMyAIController::DebugPerception() { TArray<AActor*> PerceivedActors; PerceptionComponent->GetCurrentlyPerceivedActors( UAISense_Sight::StaticClass(), PerceivedActors); for (AActor* Actor : PerceivedActors) { FActorPerceptionBlueprintInfo Info; PerceptionComponent->GetActorsPerception(Actor, Info); for (const FAIStimulus& Stimulus : Info.LastSensedStimuli) { UE_LOG(LogAI, Log, TEXT("Sensed %s via %s at %s"), *Actor->GetName(), *Stimulus.Type.Name.ToString(), *Stimulus.StimulusLocation.ToString()); } } }
디버깅 팁

Gameplay Debugger에서 Perception 카테고리(숫자 3)를 선택하면 시각 원뿔, 청각 범위, 감지된 타겟이 색상으로 표시됩니다. 녹색은 현재 감지 중, 빨간색은 감지 상실을 의미합니다.

SUMMARY

핵심 요약

  • UAIPerceptionComponent는 AIController에 감각 기능을 부여하는 핵심 컴포넌트이다
  • SenseConfig로 시각/청각/데미지 감각의 범위와 조건을 세밀하게 설정한다
  • OnTargetPerceptionUpdated 델리게이트로 감지/상실 이벤트를 처리한다
  • 다중 감각을 조합하여 복합적인 AI 인지 시스템을 구현한다
  • Gameplay Debuggerai.debug 명령으로 Perception을 실시간 디버깅한다
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: 시각 감각 설정

UAISenseConfig_Sight를 SightRadius 1500, PeripheralVisionAngleDegrees 60으로 설정한 AIController를 구현하세요. DrawDebugSphere로 감지 범위를 시각화하고 적 Actor가 범위에 들어올 때 반응을 확인합니다.

실습 2: OnTargetPerceptionUpdated 처리

OnTargetPerceptionUpdated 델리게이트에서 감지/상실 이벤트를 구분하여 Blackboard의 TargetActor와 LastKnownLocation 키를 업데이트하는 로직을 구현하세요.

심화 과제

시각(Sight)과 청각(Hearing)을 동시에 사용하는 AI를 구현하세요. 총소리에 반응하여 소리 방향을 조사하고, 시야에 적이 들어오면 전투 상태로 전환하는 복합 감각 시스템을 만듭니다.