1. 네비 메쉬 배치(NavMeshBoundsVolume)

AI가 이동할 수 있는 길인지 판단할 수 있는 투명한 메쉬를 배치한다.

레벨에 배치 후 충분히 크게 확장한다. 확장은 브러시 세팅에서 설정할 수 있다.

 

 

2. 쳐다보기 & 길 찾기 알고리즘 - ShooterAIController.cpp

#include "ShooterAIController.h"
#include "Kismet/GameplayStatics.h"


void AShooterAIController::BeginPlay()
{
    Super::BeginPlay();
}

void AShooterAIController::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

    // 길 찾기 알고리즘 적용
    APawn* PlayerPawn = UGameplayStatics::GetPlayerPawn(GetWorld(), 0);

    // 시선(LineOfSight) -> 움직임(MoveTo) -> SetFocus
    if (LineOfSightTo(PlayerPawn));
    {
        MoveToActor(PlayerPawn, 200);
        SetFocus(PlayerPawn);
    }
    else
    {
        ClearFocus(EAIFocusPriority::Gameplay);
        StopMovement();
    }
}

(1) 주시

플레이어의 폰을 찾아 고개를 돌리는 코드를 작성한다.

 

(2) 길 찾기 알고리즘 적용

MoveToActor 함수를 사용하여 찾고자 하는 액터의 위치로 이동한다.

이동하는 데에는 A* 알고리즘을 사용한다.

두번째 인수는 상대에게서 얼마만큼 떨어진 위치까지 도달할지 결정한다.

 

(3) 우선권(EAIFocusPriority)

AI가 어떤 대상에 더 관심을 줄지 설정한다.

 

- Default(기본)

이동, GamePlay 상태가 아닐 때 수행하는 동작.

 

- Move(이동)

경로를 따라 이동을 우선시 함.

 

- GamePlay(게임 플레이 - 사격, 수색 등등)

발생 조건에 따른 대응을 우선시 함.

 

(4) LineOfSightTo 함수

해당 컨트롤러가 적용 중인 액터의 눈 위치를 자동으로 계산해 인수로 받은 액터를 바라보는지 검증한다.

불리언 값을 반환한다.

 

- 참일 경우

AI가 플레이어 폰을 바라보고 있으므로, 고개를 돌리고 폰을 향해 다가온다.

이때 MoveTo의 우선권이 더 먼저 있으므로 코드의 순서가 바뀌어도 상관 없다.

 

- 거짓일 경우

설정된 포커스를 해제하고 제자리에 멈춘다.

 

 

3. 인식범위 재조정

private:
	UPROPERTY(EditAnywhere)
	float AcceptanceRadius = 200.f;
    if (LineOfSightTo(PlayerPawn));
    {
        MoveToActor(PlayerPawn, AcceptanceRadius);
        SetFocus(PlayerPawn);
    }

에디터에서 조정할 수 있도록 인식 범위를 추가한다.