Sight/Hearing/Damage Sense
시각, 청각, 데미지 감각의 상세 설정과 커스텀 Sense 제작 방법을 학습합니다
AISense_Sight 심화
시각 감지의 상세 파라미터와 최적화
UAISense_Sight는 가장 비용이 높은 Sense로, 시야 범위/각도 내에서 Line of Sight 트레이스를 수행합니다. UE5.5+에서는 비동기 트레이스와 분산 처리로 성능이 크게 개선되었습니다.
// 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은 매우 유용합니다. 근접한 적이 잠시 기둥 뒤로 숨더라도, 이 범위 내면 벽 뒤에 있어도 감지 상태를 유지합니다.
AISense_Hearing
청각 감지와 소음 발생 시스템
UAISense_Hearing은 MakeNoise() 또는 ReportNoiseEvent()로 발생한 소음을 감지합니다. Sight와 달리 이벤트 기반으로 동작하여 성능 비용이 낮습니다.
// 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의 절반 거리에서만 감지됩니다.
AISense_Damage
데미지 감지와 Prediction Sense
UAISense_Damage는 데미지 이벤트를 감지합니다. 시야나 청각과 관계없이 데미지를 받으면 즉시 공격자를 인지합니다. UAISense_Prediction은 타겟의 미래 위치를 예측합니다.
// 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를 호출하세요.
커스텀 Sense 제작
UAISense를 상속한 새로운 감각 구현
UE5는 커스텀 Sense를 제작할 수 있는 확장 포인트를 제공합니다. UAISense를 상속하고 Update()를 구현하면 "열 감지", "진동 감지" 등 고유한 감각을 만들 수 있습니다.
// 커스텀 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초 이상으로 설정하는 것이 좋습니다.
핵심 요약
- AISense_Sight는 LOS 트레이스 기반으로 가장 비용이 높으며, SightRadius/LoseSightRadius 히스테리시스를 활용해야 한다
- AISense_Hearing은 이벤트 기반으로 ReportNoiseEvent()가 MakeNoise()보다 유연하다
- AISense_Damage는 데미지 시 즉시 감지하며, Prediction Sense로 타겟 이동 예측이 가능하다
- 커스텀 Sense는 UAISense를 상속하고 Update()를 구현하여 제작하며, SenseInterval로 성능을 제어한다
도전 과제
배운 내용을 직접 실습해보세요
UAISenseConfig_Hearing을 설정하고, UAISense_Hearing::ReportNoiseEvent()로 총소리 이벤트를 발생시키세요. AI가 소리 방향으로 이동하는 행동을 BT로 구현합니다.
UAISenseConfig_Damage를 활성화하고, UAISense_Damage::ReportDamageEvent()로 피격 이벤트를 전달하세요. 시야 밖에서 공격받았을 때 공격자 방향으로 반응하는 AI를 만듭니다.
시각, 청각, 데미지 감각의 우선순위를 정의하고, 복수의 자극이 동시에 감지될 때 가장 위험한 자극에 우선 반응하는 Threat Assessment 시스템을 구현하세요.