그냥 게임개발자
[UE5] 8장 - AI 이동(C++) 본문
1. AI 컨트롤러 생성
2. NavMesh
3. AI 이동
1. AI Controller 생성
일단 AI를 만들려면 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를 사용해보자.
'UE5_Tutorial1' 카테고리의 다른 글
[UE5] LAST - AI 공격 BehaviorTree로 구현(C++) (1) | 2023.10.02 |
---|---|
[UE5] 8장 - AI 이동 BehaviorTree로 구현(C++) (0) | 2023.10.01 |
[UE5] 7장 - UI(C++) (0) | 2023.10.01 |
[UE5] 6장 - 아이템 줍기, 스탯 매니저(C++) (0) | 2023.10.01 |
[UE5] - 5장 MeleeAttack 구현(콤보 공격) (C++, 블루프린트) (0) | 2023.09.26 |