AIContriller와 네비게이션 시스템

  • 레벨에 배치한 캐릭터가 스스로 움직일 수 있도록 AI 컨트롤러를 생성해 캐릭터에게 부여한다
  • AIAController를 부모로 하는 ABAIAController 클래스를 생성
  • AI 생성 옵션을 PlaceInWorldSpawned로 설정
#include "ABAIController.h"

AABCharacter::AABCharacter()
{
...................
    AIControllerClass(pawn에 있음) = AABAIController::StaticClass();  
    AutoPossessAI(pawn에 있음) = EAutoPossessAI::PlacedInWorldOrSpawned;

}

AIController 로직을 부여

  • NPC는 스스로 움직여야 하기 떄문에 이를 보조할 내비게이션 메시를 이요ㅕㅇ한다
  • 로직을 구현하기 전에 먼제 레벨에 내비게이션 메시를 배치해 NPC가 스스로 움직일 수 있는 환경을 구축한다

  • 생성된 내비 메시를 이용하여, ABAIController에 빙의한 폰에게 목적지를 알려줘 폰이 목적지까지 스스로 움직이도록 명령을 추가한다.
  • 그리고 AI 컨트롤러에 타이머를 설치해 3초마다 폰에게 목적지로 이동하는 명령을 내린다.
  • 언리얼 엔진의 내비게이션 시스템은 이동가능한 목적지를 ㅐㄴ덤으로 가져오는 GetRandomPointInavigabkeRadius 함수와 목적지로 폰을 이동시키는 SimpleMoveToLocation 함수를 제공한다.
  • 4.20 부터는 UNavigationSystem -> UNavigationSystemV1으로 변경됨
//h
class KGAME_API AABAIController : public AAIController
{
    GENERATED_BODY()

public:
    AABAIController();
    virtual void OnPossess(APawn* InPawn) override;
    virtual void OnUnPossess() override;


private:
    void OnRepeatTimer();
    FTimerHandle RepeatTimerHandle;
    float RepeatInterval;
};

//cpp
#include "ABAIController.h"
#include "NavigationSystem.h"
#include "Blueprint/AIBlueprintHelperLibrary.h"

AABAIController::AABAIController()
{
    RepeatInterval = 3.0f;
}


void AABAIController::OnPossess(APawn* InPawn)
{
    Super::OnPossess(InPawn);
    GetWorld()->GetTimerManager().SetTimer(RepeatTimerHandle,this,
        &AABAIController::OnRepeatTimer,RepeatInterval,true);
}

void AABAIController::OnUnPossess()
{
    Super::OnUnPossess();
    GetWorld()->GetTimerManager().ClearTimer(RepeatTimerHandle);
}


void AABAIController::OnRepeatTimer()
{
    auto CurrentPawn = GetPawn();
    ABCHECK(nullptr != CurrentPawn);

    UNavigationSystemV1* NavSystem = UNavigationSystemV1::GetNavigationSystem(GetWorld());

    if (nullptr == NavSystem) return;

    FNavLocation NextLocation;

    if (NavSystem->GetRandomPointInNavigableRadius(FVector::ZeroVector, 500.0f, NextLocation))
    {
        UAIBlueprintHelperLibrary::SimpleMoveToLocation(this, NextLocation);
    }

}

행동트리 시스템

  • 행동트리는 NPC가 해야 할 행동을 분석하고 우선순위가 높은 행동부터 NPC가 실행할 수 있도록 트리 구조로 설계하는 기법
  • 블랙보드 애샛, 비헤이비어트리 에셋 을 생성
  • 위 2개를 C++ 코드를 사용할라면 'AIModule' 모듈을 추가해야한다

+ Recent posts