본문 바로가기

Unreal/언리얼 엔진 5로 개발하는 멀티플레이어 게임(Book)

[Unreal] 소음, 감지 코드 분석

US_Character.cpp

...
#include "Components/PawnNoiseEmitterComponent.h"
...

AUS_Character::AUS_Character()
{
    ...
    
    NoiseEmitter = CreateDefaultSubobject<UPawnNoiseEmitterComponent>(TEXT("NoiseEmitter"));
    NoiseEmitter->NoiseLifetime = 0.01f;
    
    ...
}

void AUS_Character::Tick(float DeltaTime)
{
    ...

    if (GetCharacterMovement()->MaxWalkSpeed == GetCharacterStats()->SprintSpeed)
    {
        auto Noise = 1.f;
        if (GetCharacterStats() && GetCharacterStats()->StealthMultiplier)
        {
            Noise = Noise / GetCharacterStats()->StealthMultiplier;
        }
        NoiseEmitter->MakeNoise(this, Noise, GetActorLocation());
    }
}

 

NoiseEmitter->NoiseLifetime: UPawnNoiseEmitterComponent로 선언된 NoiseEmitter의 NoiseLifetime 변수는 소음의 수명을 나타낸다. 새로 발생한 소음이 이전에 발생한 소음을 덮어쓰기 위해 경과해야 하는 시간을 의미한다.

StealthMultiplier: 이 스탯은 이전 글에서 작성한 값으로, 레벨이 오르면 값도 증가한다. 현재 코드에서는 레벨이 높을수록 발생하는 소음을 낮추기 위해 작성되었다.

 

US_Minion.cpp

void AUS_Minion::OnHearNoise(APawn* PawnInstigator, const FVector& Location, float Volume)
{
    GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("Noise detected!"));
    GoToLocation(Location);
}

void AUS_Minion::GoToLocation(const FVector& Location)
{
    PatrolLocation = Location;
    UAIBlueprintHelperLibrary::SimpleMoveToLocation(GetController(), PatrolLocation);
}

void AUS_Minion::PostInitializeComponents()
{
    ...
    GetPawnSense()->OnHearNoise.AddDynamic(this, &AUS_Minion::OnHearNoise);
}

 

해당 코드는 노이즈 감지를 위해 작성되었다. 단순히 노이즈가 감지되면 AddDynamic에 작성된 OnHearNoise를 통해 Location 위치로 이동시킨다.