第 11 天:打造敌人 AI(人工智能)!

🎯 目标:

理解 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(角色骨骼网格体)。

🔹 步骤:

  1. 打开 UE5 编辑器
  2. 点击 “添加/导入(Add/Import)” → “添加功能或内容包(Add Feature or Content Pack)”
  3. 选择 “第三人称(Third Person)” 模板
  4. 点击 “添加到项目”
    现在,项目中包含了 SK_Mannequin 角色模型,可以用于 AI 角色!

2️⃣ 启用 AI Perception 模块

PawnSensingComponent 依赖 AI Perception 模块,UE5 默认不会启用它,我们需要在 Build.cs 文件中添加依赖。

🔹 步骤:

  1. 在 UE5 项目目录下,打开 Source/YourProject/ 目录
  2. 找到 YourProject.Build.cs 并打开
  3. 在 PublicDependencyModuleNames 数组中添加 “AIModule”
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "AIModule" });
  1. 保存并关闭 Build.cs
  2. 右键 .uproject 文件,选择 “Generate Visual Studio project files”
  3. 重新编译项目(Ctrl + Shift + B)
    现在,PawnSensingComponent 能够正确工作,AI 可以感知玩家!

3️⃣ 创建 AI 角色(EnemyCharacter)

🔹 新建 EnemyCharacter

  1. 在 UE5,点击 “工具” → “新建 C++ 类”
  2. 选择 Character 作为基类,命名为 EnemyCharacter
  3. 点击“创建并添加到项目”,等待 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

  1. 在 UE5,点击 “工具” → “新建 C++ 类”
  2. 选择 AIController 作为基类,命名为 EnemyAIController
  3. 点击“创建并添加到项目”,等待 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)

  1. 打开ThirdPerson/Maps/ThirdPersonMap场景

  2. 添加 NavMeshBoundsVolume 到场景
    在这里插入图片描述

  3. 调整 NavMeshBoundsVolume 的大小,覆盖 AI 可移动区域

  4. P 键,查看绿色的导航网格(AI 可行走的区域)
    在这里插入图片描述
    现在,AI 可以在地图上自由移动了!
    在这里插入图片描述

7️⃣ 常见问题 & 解决方案

问题解决方案
AI 不追玩家确保 NavMeshBoundsVolume 设置正确
OnSeePawn 未触发确保 PawnSensingComponent 启用
AI 碰到障碍物停下增加 NavMeshBoundsVolume 区域

🎯 总结

使用 AIController 控制敌人
使用 PawnSensingComponent 让 AI 发现玩家
使用 MoveToActor() 让 AI 追逐玩家
启用 NavMesh 让 AI 在场景中自由移动

🎮 **明天我们将学习 AI 战斗系统,让敌人攻击玩家!**🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bluesonli

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值