🎯 目标:
✅ 理解 Unreal Engine 5 AI 系统
✅ 使用 C++ 创建敌人 AI(AIController)
✅ 让 AI 在场景中追踪玩家
✅ 使用行为树(Behavior Tree)实现更复杂的 AI
Unreal Engine 5 AI 系统概述
UE5 提供了强大的 AI 框架,允许我们创建智能敌人。常见的 AI 控制方式包括:
方式 | 描述 | 适用场景 |
---|---|---|
AIController | 让 AI 控制 Pawn 或 Character | 追踪玩家、巡逻 |
NavMesh(导航网格) | 让 AI 智能地在场景中移动 | 寻路、躲避障碍 |
Behavior Tree(行为树) | 通过决策逻辑控制 AI | 复杂 AI 逻辑 |
💡 今天,我们将创建一个 AI 敌人,让它在场景中巡逻,并在发现玩家时进行追逐!
1️⃣ 添加第三人称游戏模板
为了给敌人 AI 设置合适的角色模型,我们需要先在 UE5 添加第三人称游戏模板,该模板包含 一个可用的 SkeletalMesh(角色骨骼网格体)。
🔹 步骤:
- 打开 UE5 编辑器
- 点击 “添加/导入(Add/Import)” → “添加功能或内容包(Add Feature or Content Pack)”
- 选择 “第三人称(Third Person)” 模板
- 点击 “添加到项目”
✅ 现在,项目中包含了 SK_Mannequin 角色模型,可以用于 AI 角色!
2️⃣ 启用 AI Perception 模块
PawnSensingComponent 依赖 AI Perception 模块,UE5 默认不会启用它,我们需要在 Build.cs 文件中添加依赖。
🔹 步骤:
- 在 UE5 项目目录下,打开 Source/YourProject/ 目录
- 找到 YourProject.Build.cs 并打开
- 在 PublicDependencyModuleNames 数组中添加 “AIModule”
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "AIModule" });
- 保存并关闭 Build.cs
- 右键 .uproject 文件,选择 “Generate Visual Studio project files”
- 重新编译项目(Ctrl + Shift + B)
✅ 现在,PawnSensingComponent 能够正确工作,AI 可以感知玩家!
3️⃣ 创建 AI 角色(EnemyCharacter)
🔹 新建 EnemyCharacter
- 在 UE5,点击 “工具” → “新建 C++ 类”
- 选择 Character 作为基类,命名为 EnemyCharacter
- 点击“创建并添加到项目”,等待 UE5 生成代码
🔹 修改 EnemyCharacter.h
📌 为敌人添加 AI 控制
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "Perception/PawnSensingComponent.h"
#include "EnemyCharacter.generated.h"
UCLASS()
class MYGAME_API AEnemyCharacter : public ACharacter
{
GENERATED_BODY()
public:
AEnemyCharacter();
protected:
virtual void BeginPlay() override;
private:
UPROPERTY(VisibleAnywhere)
UPawnSensingComponent* PawnSensingComponent;
UFUNCTION()
void OnSeePlayer(APawn* Pawn);
};
🔹 修改 EnemyCharacter.cpp
📌 初始化 AI 视觉感知
#include "EnemyCharacter.h"
#include "UObject/ConstructorHelpers.h"
AEnemyCharacter::AEnemyCharacter()
{
PrimaryActorTick.bCanEverTick = true;
// 加载第三人称模板中的角色模型
static ConstructorHelpers::FObjectFinder<USkeletalMesh> MeshAsset(TEXT("/Game/Characters/Mannequins/Meshes/SKM_Quinn.SKM_Quinn"));
if (MeshAsset.Succeeded())
{
GetMesh()->SetSkeletalMesh(MeshAsset.Object);
}
GetMesh()->SetRelativeLocation(FVector(0.0f, 0.0f, -90.0f));
GetMesh()->SetRelativeRotation(FRotator(0.0f, -90.0f, 0.0f));
// 创建 AI 视觉感知组件
PawnSensingComponent = CreateDefaultSubobject<UPawnSensingComponent>(TEXT("PawnSensingComponent"));
PawnSensingComponent->SetPeripheralVisionAngle(90.0f); // 视野角度
}
void AEnemyCharacter::BeginPlay()
{
Super::BeginPlay();
// 绑定玩家检测事件
if (PawnSensingComponent)
{
PawnSensingComponent->OnSeePawn.AddDynamic(this, &AEnemyCharacter::OnSeePlayer);
}
}
void AEnemyCharacter::OnSeePlayer(APawn* Pawn)
{
UE_LOG(LogTemp, Warning, TEXT("敌人发现了玩家:%s"), *Pawn->GetName());
}
✅ 现在,AI 在发现玩家时会在日志中打印玩家的名字!
4️⃣ 创建 AI 控制器(EnemyAIController)
为了让 AI 角色移动,我们需要 AIController 控制敌人。
🔹 新建 EnemyAIController
- 在 UE5,点击 “工具” → “新建 C++ 类”
- 选择 AIController 作为基类,命名为 EnemyAIController
- 点击“创建并添加到项目”,等待 UE5 生成代码
🔹 修改 EnemyAIController.h
📌 让 AI 追踪玩家
#pragma once
#include "CoreMinimal.h"
#include "AIController.h"
#include "EnemyAIController.generated.h"
UCLASS()
class MYGAME_API AEnemyAIController : public AAIController
{
GENERATED_BODY()
public:
virtual void BeginPlay() override;
void ChasePlayer(APawn* PlayerPawn);
};
🔹 修改 EnemyAIController.cpp
📌 让 AI 追踪玩家
#include "EnemyAIController.h"
#include "Kismet/GameplayStatics.h"
#include "NavigationSystem.h"
void AEnemyAIController::BeginPlay()
{
Super::BeginPlay();
}
void AEnemyAIController::ChasePlayer(APawn* PlayerPawn)
{
if (PlayerPawn)
{
MoveToActor(PlayerPawn, 5.0f); // 追踪玩家,保持 5.0f 的距离
}
}
✅ 现在,AI 可以在发现玩家后追踪它!
5️⃣ 让 AI 在发现玩家时开始追逐
我们需要在 EnemyCharacter 发现玩家时,调用 EnemyAIController 的 ChasePlayer()。
📌 修改 EnemyCharacter.cpp
#include "EnemyCharacter.h"
#include "EnemyAIController.h"
AEnemyCharacter::AEnemyCharacter()
{
//设置控制器为AEnemyAIController
AIControllerClass = AEnemyAIController::StaticClass();
}
void AEnemyCharacter::OnSeePlayer(APawn* Pawn)
{
AEnemyAIController* AIController = Cast<AEnemyAIController>(GetController());
if (AIController)
{
AIController->ChasePlayer(Pawn);
}
}
✅ 现在,AI 发现玩家后,会主动追逐玩家!
6️⃣ 设置 AI 导航网格(NavMesh)
为了让 AI 能够正确寻路,我们需要在 UE5 启用导航网格(NavMesh):
-
打开ThirdPerson/Maps/ThirdPersonMap场景
-
添加 NavMeshBoundsVolume 到场景
-
调整 NavMeshBoundsVolume 的大小,覆盖 AI 可移动区域
-
按 P 键,查看绿色的导航网格(AI 可行走的区域)
✅ 现在,AI 可以在地图上自由移动了!
7️⃣ 常见问题 & 解决方案
问题 | 解决方案 |
---|---|
AI 不追玩家 | 确保 NavMeshBoundsVolume 设置正确 |
OnSeePawn 未触发 | 确保 PawnSensingComponent 启用 |
AI 碰到障碍物停下 | 增加 NavMeshBoundsVolume 区域 |
🎯 总结
✅ 使用 AIController 控制敌人
✅ 使用 PawnSensingComponent 让 AI 发现玩家
✅ 使用 MoveToActor() 让 AI 追逐玩家
✅ 启用 NavMesh 让 AI 在场景中自由移动
🎮 **明天我们将学习 AI 战斗系统,让敌人攻击玩家!**🚀