AIPerceptionComponent 기초
AIPerceptionComponent의 설정, SenseConfig 구성, Stimulus 처리 기초를 학습합니다
AIPerceptionComponent 설정
AI에 감각 기능을 부여하는 컴포넌트
UAIPerceptionComponent는 AIController에 부착되어 시각, 청각, 데미지 등 다양한 감각을 처리합니다. SenseConfig를 통해 어떤 감각을 사용할지 설정합니다.
// 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보다 크게 설정하세요. 이 차이가 타겟을 감지한 후 놓치기까지의 히스테리시스 구간입니다.
Stimulus와 이벤트 처리
감각 자극을 수신하고 반응하는 방법
Perception이 감지한 자극은 OnTargetPerceptionUpdated 델리게이트를 통해 수신합니다. FAIStimulus 구조체에 감각 유형, 위치, 강도 등의 정보가 담깁니다.
// 이벤트 바인딩
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);
}
}다중 감각 설정
시각과 청각을 동시에 사용하는 AI
실전 AI는 여러 감각을 복합적으로 사용합니다. 시각으로 적을 직접 확인하고, 청각으로 소리 방향을 감지하여 탐색 행동을 유발할 수 있습니다.
// 시각 + 청각 복합 설정
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
);SetMaxAge()는 감각 자극의 유효 시간입니다. 시각은 5초, 청각은 3초로 설정하면 적을 놓친 후 일정 시간만 기억하고 이후 잊어버리는 자연스러운 행동을 구현할 수 있습니다.
Perception 디버깅
감각 시스템의 시각적 디버깅
AI Perception 시스템은 Gameplay Debugger와 AI Debug Draw를 통해 시각적으로 디버깅할 수 있습니다. 감지 범위, 감지된 타겟, 자극 위치를 실시간으로 확인하세요.
// 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)를 선택하면 시각 원뿔, 청각 범위, 감지된 타겟이 색상으로 표시됩니다. 녹색은 현재 감지 중, 빨간색은 감지 상실을 의미합니다.
핵심 요약
- UAIPerceptionComponent는 AIController에 감각 기능을 부여하는 핵심 컴포넌트이다
- SenseConfig로 시각/청각/데미지 감각의 범위와 조건을 세밀하게 설정한다
- OnTargetPerceptionUpdated 델리게이트로 감지/상실 이벤트를 처리한다
- 다중 감각을 조합하여 복합적인 AI 인지 시스템을 구현한다
- Gameplay Debugger와 ai.debug 명령으로 Perception을 실시간 디버깅한다
도전 과제
배운 내용을 직접 실습해보세요
UAISenseConfig_Sight를 SightRadius 1500, PeripheralVisionAngleDegrees 60으로 설정한 AIController를 구현하세요. DrawDebugSphere로 감지 범위를 시각화하고 적 Actor가 범위에 들어올 때 반응을 확인합니다.
OnTargetPerceptionUpdated 델리게이트에서 감지/상실 이벤트를 구분하여 Blackboard의 TargetActor와 LastKnownLocation 키를 업데이트하는 로직을 구현하세요.
시각(Sight)과 청각(Hearing)을 동시에 사용하는 AI를 구현하세요. 총소리에 반응하여 소리 방향을 조사하고, 시야에 적이 들어오면 전투 상태로 전환하는 복합 감각 시스템을 만듭니다.