RPC游戏案例【4. AI行为树】

AI行为树

本章工程文件为:RPG_Tutorial_Series_08,如遇问题可下载项目文件之后自行对照

巡逻

创建一个AI文件夹,然后创建一个BlackBoard,命名为BD_AI

image-20230717112142223

再创建一个Behavior Tree,命名为BT_AI

image-20230717112515175

再创建一个AI控制器的蓝图,命名为BP_AIController_Generic

image-20230717112702234

编写蓝图如下,只需要让AI行为树Run起来

image-20230717114107804

接下来将Blueprints下的BP_Dummy复制到AI目录下,并改名为BP_AI

image-20230717114206444

打开它,应用上我们刚刚创建的AIControllerClass

image-20230717114249973

同时打开Orient Rotation to Movement,让转向更平滑

image-20230717114343357

回到BT_AI,添加巡逻行为树逻辑如下

image-20230717114528160

其中自定义的BT_Task_PatrolRandomPoint任务,存放再AI/Tasks目录下,具体任务逻辑如下

image-20230717114827046

来到场景中,放置一个NavMeshBoundsVolume,将这个导航体积覆盖所有地面,然后将BP_AI也放入场景中

image-20230717115031430

点击运行,就会发现BP_AI开始在场景里巡逻了

但是运行的很僵硬,没有动作,所以我们再创建一个Animation Blueprint,命名为ABP_AI

image-20230717115242176

从之前的ABP_RPGCharacter中复制运动逻辑过来

image-20230717120118380

image-20230717120046407

这样就能看到NPC在正常巡逻了

检测与追捕

首先打开DB_AI,创建一个Object变量

image-20230720111457764

打开BP_AIController_Generic,新增一个AIPerception组件,并编写检测与追捕逻辑

这里用到的是AI视觉感知,其他的感知可以参考文档

虚幻引擎AI感知 | 虚幻引擎5.2文档 (unrealengine.com)

image-20230720111743832

打开BT_AI,点击New Task里的BTTask_BlueprintBase,选中Task文件夹,新建一个BT_Task_ChaseTarget任务

image-20230720112122661

然后再回到BT_AI,在原来的Patrol Sequence的左边再新建一个Chase Target Sequence序列,并调用BT_Task_ChaseTarget任务(先忽略蓝色的装饰器)

image-20230720112254589

选中Chase Target Sequence,新建一个blackboard装饰器

image-20230720112400706

image-20230720112426422

Patrol Sequence也是一样新建一个blackboard装饰器

image-20230720112503350

打开BP_ThirdPersonCharacter,新增一个AIPerceptionStimuliSource组件,并做如下配置

image-20230720112608167

打开BP_AI,将人物的速度调整至450

image-20230720112730098

最后打开项目目录的DefaultGame.ini,新增如下配置

意思就是找到代码中的AI模块中的视觉感知模块,将其中的将所有Pawns作为刺激源的功能关掉,这就能避免敌人也触发视觉感知组件。

1
2
[/Script/AIModule.AISense_Sight]
bAutoRegisterAllPawnsAsSources=false

image-20230720112816639

再运行项目,即可发现角色可以检测并追捕人物了(按逗号可以看到绿色的运算过程)

image-20230720112948266

近身攻击

这一部分要实现的效果是,当NPC追捕到附近时,就发动攻击

首先打开BD_AI,创建一个bool的key,命名为inMeleeAttackRange

image-20230820104828589

打开BT_AI,创建一个service,命名为BT_Service_GetDistanceToTarget

image-20230820104914186

image-20230820104942338

编写如下逻辑

image-20230820105329770

然后打开BT_AI,将这个service应用上去

image-20230820100738224

创建一个蓝图接口,命名为BPI_AI_BehaviorTrees

image-20230820105523710

新增一个attack函数

image-20230820105649263

然后打开BP_AI,实现这个函数(这个函数将会在行为树中被调用)

image-20230820105722543

接着再创建一个新的Task,命名为BT_Task_AttackTarget,当追逐到指定距离内时,就触发攻击逻辑

image-20230820105308852

将它应用到BT_AI中就可以了

image-20230820105424534

image-20230820105855861