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' 모듈을 추가해야한다
'Unreal > Game 1 (C++)' 카테고리의 다른 글
19. AI 컨트롤러와 행동트리 3 (추격) (0) | 2019.05.08 |
---|---|
19. AI 컨트롤러와 행동트리 2 (정찰) + BTTask_ (1) | 2019.05.08 |
18.UI와 데이터의 연동 (1) | 2019.05.08 |
17.모듈과 빌드 설정 (UI작업중) (0) | 2019.05.08 |
16.게임데이터+ Transient(직렬화 해제) (0) | 2019.05.08 |