目录
前言
效果
步骤
一、准备工作
二、用蓝图实现AI随机移动
三、用行为树实现AI随机移动与跟踪玩家并攻击的效果
3.1 AI随机移动
3.2 AI看到玩家后跟踪玩家
3.3 AI攻击玩家
前言
本篇文章要实现的效果是:小白人随机移动,并且在移动过程中如果看见了玩家,小白人就会跑向玩家,靠近玩家之后就会进行攻击。
效果
步骤
一、准备工作
1. 新建一个第三人称游戏工程,复制一份第三人称模板蓝图,命名为“AI_BP”
打开“AI_BP”,删除事件图表中的所有节点
删除摄像机和弹簧臂组件
接下来需要完成AI随机移动的功能
二、用蓝图实现AI随机移动
首先介绍一下最关键的“AIMoveTo”节点,其中“Pawn”引脚表示是哪个AI要移动,“Destionation”表示AI要移动到哪个地方,“Target Actor”表示要移动到哪个actor所在的位置,“Acceptance Radius”表示距离目标半径为多远就可以停止,“Stop on Overlap”表示AI移动到指定位置后是否停止。
2. 向场景中拖入一个导航网格体边界体积
3. 在“AI_BP”的事件图表中创建一个AI随机移动的自定义事件,如下,让AI在以自身为圆心半径5000cm的范围内随机移动
每3~5s执行以下“AI移动事件”
4. 将“AI_BP”拖入场景,此时运行就可以看到小白人在随机移动
三、用行为树实现AI随机移动与跟踪玩家并攻击的效果
3.1 AI随机移动
将“AI_BP”事件图表中的所有节点删除
5. 新建一个行为树和黑板
6. 再添加一个AI控制器
这里就命名为“MyAIController”
打开黑板,新建一个布尔类型的变量
这里命名为“是否看到玩家”
再添加一个向量类型的变量,这里命名为“要去的地方”
8. 打开“MyAIController”,添加一个AI感知组件
在右侧细节面板中添加一个感官配置元素,然后这里用到的是“AI视力配置”
在AI视力配置中需要勾选检测中立方,这样AI才能感知到玩家
添加目标感知更新时的事件
在目标感知更新时的节点中,actor引脚传入的是AI感知到的Actor(Pawn或角色),“Stimulus”引脚传入的是感知到的Actor的一些其它信息
我们可以尝试打印看一下AI能否成功感知
下面需要让AI使用AIController
9. 打开“BP_AI”,设置AI控制器类为“MyAIController”
此时运行游戏,当玩家进入AI的视野后就可以看到打印了True,当玩家在视野外时可以看到打印为Fasle。因为我们可以根据这个结果对AI的行为进行设置。
10. 打开AI行为树,设置黑板资产为我们创建的那个黑板
选择完成后可以看到右下角出现了我们在黑板中设置的变量
添加如下节点,我们希望当AI看到玩家时走左边的路线,没看到玩家时走右边的路线
选择左边的“Sequence”节点,点击添加装饰器,选择“Blackboard”
此时就可以将黑板中的变量调用过来
选中“Blackboard Based Condition”,然后设置黑板键为“是否看到玩家”
同样的步骤设置一下右边的“Sequence”节点,但是键查询设置为未设置。此时左边就表示了看到玩家,右边表示没有看到玩家。
设置左右两边的观察器中止都为“Both”
·None:不中断。它的子节点将继续执行。
·Lower Priority:打断除去自己子树外所有比自己优先级更低(执行索引更大)的节点,抢夺执行权。
·Self:立即终止自己子节点的执行,让出执行权。
·Both:结合了Lower Priority和Self的特性,打断包括自己子节点在内的所有比自己优先级低(执行索引更大)的节点。
下面我们需要将AI是否看到玩家的这个变量实时的传入黑板。
11. 打开“MyAIController”,添加如下节点,此时就可以将是否看到玩家的结果赋值到黑板中的变量“是否看到玩家”
12. 回到行为树中,继续编辑当AI看到玩家之后要做什么的逻辑。
点击“新建任务”
这里命名为“随机找点”
13. 在“随机找点”中,重载函数“接收执行AI”
引脚“Controlled Pawn”表示AI控制器控制的Pawn
添加如下节点,表示AI移动到目的地后就完成执行,完成执行后继续做下一个任务。注意最后的“完成执行”很重要,如果不加这个节点,流程就会卡在这里,不会执行后面的任务。
14. 回到行为树中,此时可以在“Tasks”中找到任务“随机找点”
我们还可以添加一个系统自带的任务“Wait”,这样每次随机找点后就会等待5s(注意这里的每次循环是从Sequence出发,不是从跟出发)
15. 需要在“MyAIController”中设置使用行为树
此时我们已经完成了AI在没有看到玩家时的行为。此时运行可以看到AI能够随机移动。
下面我们还需完成AI在看到玩家后的行为。
3.2 AI看到玩家后跟踪玩家
16. 回到行为树中,再次新建一个任务
选择“BTTask_BlueprintBase”
命名为“寻找玩家”
17. 打开“寻找玩家”,重载函数“接收执行AI”
在事件图表中添加如下节点,让AI向着玩家所在位置移动
此时我们完成了寻找玩家任务的创建,还需在行为树中使用。
18. 在行为树中添加寻找玩家的任务。
此时运行可以发现AI在看到玩家后已经可以跟踪玩家了。
这里的问题是一旦玩家走出视锥角度外,AI就不会跟踪玩家了,因此我们需要AI一直朝向玩家。
19. 打开“AI_BP”,在类默认值中取消勾选将旋转朝向运动
勾选“使用控制器旋转Yaw”,此时AI的旋转就由AIController控制
在“寻找玩家”的事件图表中,添加“设置焦距”节点,该节点能够让AI控制器获取玩家的朝向,从而控制AI一直朝向玩家
20. 打开“随机找点”,在AI失去玩家的视野后我们还需关闭焦距
此时运行游戏可以看到无论我们怎样绕圈AI都能跟随玩家
下面我们需要实现AI在靠近玩家一定范围内后会向玩家挥拳。
3.3 AI攻击玩家
21. 打开“AI_BP”,添加一个球形碰撞
这里设置球体半径为80
22. 添加一个AI攻击的动画序列,对该动画序列创建动画蒙太奇(注意导入动画序列时选择的骨骼是女性的小白人骨骼)
23. 当玩家进入球形碰撞区域内时,让AI播放攻击的蒙太奇动画
上面的逻辑只能让AI攻击一次,我们需要在玩家进入碰撞区域后让AI一直播放攻击动画直到玩家离开。因此我们使用一个定时器来实现循环攻击的效果。当玩家离开球形碰撞区域后就清除定时器。
此时运行可以看到当玩家进入球形碰撞区域后小白人会播放攻击玩家的动画
参考视频:
https://www.bilibili.com/video/BV155411P7Tx/?spm_id_from=333.999.0.0&vd_source=36a3e35639c44bb339f59760641390a8