그냥 게임개발자

[UE5] 8장 - AI 이동(C++) 본문

UE5_Tutorial1

[UE5] 8장 - AI 이동(C++)

sudoju 2023. 10. 1. 16:43

1. AI 컨트롤러 생성

2. NavMesh

3. AI 이동

 

 

1. AI Controller 생성

일단 AI를 만들려면 AIController를 생성해야한다.

AIController

그 다음 우리는 프로젝트 빌드(프로젝트명.Build.cs) 파일에 3가지를 추가해줘야 한다.

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG", "NavigationSystem",  "AIModule", "GamePlayTasks"});

이것을 해줘야 한다.

 

2. NavMesh

NavMeshVolume을 생성해서 AI가 갈 수 있는 길을 구워주자.

P 버튼을 누르면 초록색으로 어디로 이동할 수 있는지 나온다.

스케일은 알아서 설정하자.

 

 

 

 

3. AI 이동

이제 우리는 OnPossess, OnUnPossess 함수를 만들어줘야 한다.

OnPossess()

Pawn의 컨트롤러가 빙의가 될 때 불러와지는 함수

OnUnPossess()

Pawn의 컨트롤러가 빙의가 끝났을 때 불러와지는 함수

MyAIController.h

public:
	AMyAIController();

	// Pawn이 빙의 될 때 불러와지는 함수
	virtual void OnPossess(APawn* InPawn) override;
	// Pawn이 빙의가 끝났을 때 불러와지는 함수
	virtual void OnUnPossess() override;

private:
	void RandomMove();

private:
	FTimerHandle TimerHandle;

MyAIController.cpp

#include "FirstProject/AI/MyAIController.h"
#include "NavigationSystem.h"
#include "Blueprint/AIBlueprintHelperLibrary.h"

AMyAIController::AMyAIController()
{

}

void AMyAIController::OnPossess(APawn* InPawn)
{
	Super::OnPossess(InPawn);
	// 월드의 타임의 1.5초마다 RandomMove함수를 실행
	// 나중에 BehaviorTree를 사용할 것이기에 깊이 파지는 말자
	// (타이머 핸들, 누가 실행할지, 뭐 실행할지, 실행 주기, true로 해놓으면 실행때부터 딜레이 걸림)
	GetWorld()->GetTimerManager().SetTimer(TimerHandle, this, &AMyAIController::RandomMove, 1.5f, true);
}

void AMyAIController::OnUnPossess()
{
	Super::OnUnPossess();

	// 핸들을 주기마다 실행할 이벤트에서 빼는 역할
	GetWorld()->GetTimerManager().ClearTimer(TimerHandle);
}

void AMyAIController::RandomMove()
{
	// 폰을 가져와서
	auto CurrentPawn = GetPawn();

	// 네비게이션 시스템을 가져온다.
	UNavigationSystemV1* NavSystem = UNavigationSystemV1::GetNavigationSystem(GetWorld());
	if (NavSystem == nullptr)
		return;

	FNavLocation RandomLocation;		// 네비 기반으로 좌표찍어놓을 변수
	// ZeroVector중심으로 500거리의 내 랜덤한 위치를 RandomLocation에 찍어놓는데에 성공하면
	if (NavSystem->GetRandomPointInNavigableRadius(FVector::ZeroVector, 500.f, RandomLocation))
	{
		// AI 한테 찍은 좌표로 이동시키라고 명령
		UAIBlueprintHelperLibrary::SimpleMoveToLocation(this, RandomLocation);
	}

 

이제 우리는 MyCharacter.cpp에 AIControllerClass에 우리가 만들어놓은 MyAIController클래스를 기본으로 지정한다.

 

MyCharacter.cpp

AMyCharacter::AMyCharacter()
{

....


	// AIControllerClass를 우리가 만든 AMyAIController클래스로 기본으로 지정하겠다고 설정
	AIControllerClass = AMyAIController::StaticClass();
	// AutoPossesAI를 월드에 배치가 되거나 스폰이 되었을 때로 설정
	AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned;
}

이제 빌드하고 실행해보자.

잘 된다 다음에는 BehaviorTree를 사용해보자.