PART 3 - 강의 2/3

Sight/Hearing/Damage Sense

시각, 청각, 데미지 감각의 상세 설정과 커스텀 Sense 제작 방법을 학습합니다

01

AISense_Sight 심화

시각 감지의 상세 파라미터와 최적화

UAISense_Sight는 가장 비용이 높은 Sense로, 시야 범위/각도 내에서 Line of Sight 트레이스를 수행합니다. UE5.5+에서는 비동기 트레이스와 분산 처리로 성능이 크게 개선되었습니다.

C++// Sight Config 상세 설정 UAISenseConfig_Sight* SightConfig = NewObject<UAISenseConfig_Sight>(); // 기본 시야 파라미터 SightConfig->SightRadius = 3000.f; // 감지 거리 SightConfig->LoseSightRadius = 3500.f; // 감지 상실 거리 SightConfig->PeripheralVisionAngleDegrees = 60.f; // 시야각 (반각) // 실제 시야각 = 60 * 2 = 120도 // 자극 만료 시간 (이 시간 후 액터 "잊음") SightConfig->SetMaxAge(5.f); // Affiliation 필터 SightConfig->DetectionByAffiliation.bDetectEnemies = true; SightConfig->DetectionByAffiliation.bDetectNeutrals = true; SightConfig->DetectionByAffiliation.bDetectFriendlies = false; // Auto Success Range: 이 거리 이내면 LOS 무시하고 즉시 감지 SightConfig->AutoSuccessRangeFromLastSeenLocation = 500.f; // Point Of View 백밴드: 눈 위치 자동 계산 // AIController->GetFocalPointOnActor() 사용 // Sight 최적화: 프레임당 처리할 최대 쿼리 수 // Project Settings > AI System > Sight // MaxTracesPerTick: 기본값 = 6 (필요시 조정)

AutoSuccessRangeFromLastSeenLocation은 매우 유용합니다. 근접한 적이 잠시 기둥 뒤로 숨더라도, 이 범위 내면 벽 뒤에 있어도 감지 상태를 유지합니다.

02

AISense_Hearing

청각 감지와 소음 발생 시스템

UAISense_HearingMakeNoise() 또는 ReportNoiseEvent()로 발생한 소음을 감지합니다. Sight와 달리 이벤트 기반으로 동작하여 성능 비용이 낮습니다.

C++// Hearing Config 설정 UAISenseConfig_Hearing* HearingConfig = NewObject<UAISenseConfig_Hearing>(); HearingConfig->HearingRange = 2000.f; // 청각 범위 HearingConfig->SetMaxAge(3.f); // 소음 기억 시간 HearingConfig->DetectionByAffiliation.bDetectEnemies = true; HearingConfig->DetectionByAffiliation.bDetectNeutrals = true; HearingConfig->DetectionByAffiliation.bDetectFriendlies = false; // LoSHearingConfig: 벽 너머 소음 감쇠 여부 // bUseLoSHearing = true 시 벽을 통과하면 감쇠 PerceptionComponent->ConfigureSense(*HearingConfig); // 소음 발생 방법 1: AActor::MakeNoise() // PawnNoiseEmitter 필요 GetPawn()->MakeNoise( 1.0f, // Loudness (0~1) GetPawn(), // 소음 발생자 FVector::ZeroVector, // 위치 (0 = Pawn 위치) 0.f, // MaxRange (0 = Config 기본값) FName("Gunshot") // 태그 ); // 소음 발생 방법 2: UAISense_Hearing::ReportNoiseEvent() // PawnNoiseEmitter 불필요, 더 유연 FAINoiseEvent NoiseEvent; NoiseEvent.Instigator = ShootingActor; NoiseEvent.Loudness = 1.0f; NoiseEvent.MaxRange = 5000.f; NoiseEvent.NoiseLocation = ShootingActor->GetActorLocation(); NoiseEvent.Tag = FName("Explosion"); UAISense_Hearing::ReportNoiseEvent( GetWorld(), NoiseEvent);
참고

소음 감지 거리는 HearingRange * Loudness로 결산됩니다. Loudness 0.5의 소음은 HearingRange의 절반 거리에서만 감지됩니다.

03

AISense_Damage

데미지 감지와 Prediction Sense

UAISense_Damage는 데미지 이벤트를 감지합니다. 시야나 청각과 관계없이 데미지를 받으면 즉시 공격자를 인지합니다. UAISense_Prediction은 타겟의 미래 위치를 예측합니다.

C++// Damage Sense Config UAISenseConfig_Damage* DamageConfig = NewObject<UAISenseConfig_Damage>(); DamageConfig->SetMaxAge(10.f); // 데미지 기억 시간 PerceptionComponent->ConfigureSense(*DamageConfig); // 데미지 이벤트 보고 - TakeDamage에서 호출 float AMyCharacter::TakeDamage(float Damage, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) { float ActualDamage = Super::TakeDamage( Damage, DamageEvent, EventInstigator, DamageCauser); // Perception 시스템에 데미지 보고 UAISense_Damage::ReportDamageEvent( GetWorld(), this, // 피해자 EventInstigator ? EventInstigator->GetPawn() : DamageCauser, // 가해자 ActualDamage, // 데미지량 GetActorLocation(), // 피해 위치 DamageCauser ? DamageCauser->GetActorLocation() : GetActorLocation() // 공격 출발 위치 ); return ActualDamage; } // Prediction Sense - 타겟 이동 예측 // 타겟이 시야에서 사라질 때 예상 위치를 계산 UAISense_Prediction::RequestPawnPredictionEvent( GetPawn(), // 예측 요청자 TargetPawn, // 예측 대상 1.5f // 예측 시간 (초) );

AISense_Prediction은 적이 엄폐물 뒤로 숨었을 때 "예상 위치로 이동"하는 AI를 구현할 때 활용합니다. Sight 상실 콜백에서 RequestPawnPredictionEvent를 호출하세요.

04

커스텀 Sense 제작

UAISense를 상속한 새로운 감각 구현

UE5는 커스텀 Sense를 제작할 수 있는 확장 포인트를 제공합니다. UAISense를 상속하고 Update()를 구현하면 "열 감지", "진동 감지" 등 고유한 감각을 만들 수 있습니다.

C++// 커스텀 Sense: 열 감지 UCLASS() class UAISense_Heat : public UAISense { GENERATED_BODY() public: UAISense_Heat(); // 핵심: Sense 업데이트 로직 virtual float Update() override; // Sense 설정 클래스 연결 virtual TSubclassOf<UAISenseConfig> GetSenseConfigClass() const; // 이벤트 보고 (static) static void ReportHeatEvent(UObject* WorldCtx, AActor* Source, float Temperature); protected: // 보고된 이벤트 큐 TArray<FAIHeatEvent> RegisteredEvents; }; // 커스텀 Sense Config UCLASS() class UAISenseConfig_Heat : public UAISenseConfig { GENERATED_BODY() public: UPROPERTY(EditAnywhere) float DetectionRange = 1500.f; UPROPERTY(EditAnywhere) float MinTemperature = 100.f; // 감지 최소 온도 virtual TSubclassOf<UAISense> GetSenseImplementation() const override { return UAISense_Heat::StaticClass(); } }; // Update() 구현 - 매 Tick 호출 float UAISense_Heat::Update() { AIPerception::FListenerMap& Listeners = *GetListeners(); for (const FAIHeatEvent& Event : RegisteredEvents) { for (auto& ListenerPair : Listeners) { FPerceptionListener& Listener = ListenerPair.Value; // 거리, 온도 조건 검사 후 Stimulus 생성 // ... } } RegisteredEvents.Reset(); return SenseInterval; // 다음 Update 간격 }
주의

커스텀 Sense의 Update()는 성능에 직접 영향을 미칩니다. SenseInterval을 적절히 설정하고, 불필요한 연산을 최소화하세요. Sight처럼 매 프레임 호출이 필요 없다면 0.5초 이상으로 설정하는 것이 좋습니다.

SUMMARY

핵심 요약

  • AISense_Sight는 LOS 트레이스 기반으로 가장 비용이 높으며, SightRadius/LoseSightRadius 히스테리시스를 활용해야 한다
  • AISense_Hearing은 이벤트 기반으로 ReportNoiseEvent()가 MakeNoise()보다 유연하다
  • AISense_Damage는 데미지 시 즉시 감지하며, Prediction Sense로 타겟 이동 예측이 가능하다
  • 커스텀 Sense는 UAISense를 상속하고 Update()를 구현하여 제작하며, SenseInterval로 성능을 제어한다
PRACTICE

도전 과제

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

실습 1: 청각 감각 구현

UAISenseConfig_Hearing을 설정하고, UAISense_Hearing::ReportNoiseEvent()로 총소리 이벤트를 발생시키세요. AI가 소리 방향으로 이동하는 행동을 BT로 구현합니다.

실습 2: 데미지 감각 활용

UAISenseConfig_Damage를 활성화하고, UAISense_Damage::ReportDamageEvent()로 피격 이벤트를 전달하세요. 시야 밖에서 공격받았을 때 공격자 방향으로 반응하는 AI를 만듭니다.

심화 과제

시각, 청각, 데미지 감각의 우선순위를 정의하고, 복수의 자극이 동시에 감지될 때 가장 위험한 자극에 우선 반응하는 Threat Assessment 시스템을 구현하세요.