UE4敌人AI,Roll点数特别好用

之前一篇博文讲了AI的一些基本思路,后来又看了一些关于AI的教程,文档和神秘代码之后,发现最适合自己的还是那个思路。毕竟UE4的路很多,选择自己顺手的才是最适合的。

经过一些修改之后,AI控制器蓝图我已经基本不用了,由敌人的父级蓝图来进行一些关于AI控制器的数值传递与一些初始化工作。整个AI最核心的部分就是行为树和第一个选择器上的行为树服务蓝图,这个思路依旧不变。不过随着黑板键值越来越多之后,需要公开变量也越来越多,这是一个待解决问题。

眼尖的你可能已经发现了,选择器上有一个前置条件就是在不为闲置的时候运行行为树,这个主要作用就是在AI之间对打胜利之后清除仇恨。由于目前还没做队友AI的相关内容,所以加了这一条件。

这是目前行为树服务蓝图的内容。主要是根据与目标距离来选择部分攻击。让玩家在各个距离段都感受到压力才是我的目标。当然,AI一直攻击没完没了,缺少平衡是绝对没什么乐趣可言的。在之前的博文中我也有截图,利用欲望点来控制AI的攻击频率。

 同时利用CompareInt节点,让欲望点也可以控制AI的行动,来决定普通攻击或者是重击等行为。CompareInt节点非常方便,可以让AI的行动进一步随机化。

在后来我又增加了“行动点”变量来进一步控制AI的攻击频率,在每次攻击之后都会消耗“行动点”来防止AI连续攻击过多。不过不建议把行动点设置太高,会让AI看起来略微奇怪。

(来自Youtube,需要翻墙)

之前说的坑:

清除黑板键值这件事已经不干了,这是个错误的方向。行为树节点Decorator里的Flow Control不要随便设置即可,尤其是中止设置,除非你清楚这到底是干什么的,否则不要去动这个选项。

UE4类黑魂锁定系统

黑魂的锁定系统不说完美,但对于一个强调实时对敌人出招做出反应的游戏来讲,已经算不错了。除了预设的锁定位置可能不够好,视角及“瞎几把滚”之外,锁定系统起到的作用还是相当不错的,至少大幅减少了玩家在战斗中控制角色轴向带来的蛋疼问题。

几个主要功能如下:镜头方向寻查及锁定敌人、锁定后永面对敌人、摄像机随敌人移动而移动、自动调整玩家人物轴向。

在制作锁定系统时,参考了President Nelson的《Alice In Tokyo Wonderland》关于锁定的部分思路。本篇文章的结尾会列出他的几个视频。相比Get All Actor Of Class节点,我使用了形状追踪,这样范围更可控一些。在场景内的Actor数量很多时,相比前者节点更省资源。单线追踪相对获取目标敌人来说不是非常适合,判定要比形状追踪更苛刻。

一、获取敌人

这里使用CapsuleTraceForObjects来获取是否有敌人在范围内,Ignore Targets变量来无视当前目标(如果有多个目标在当前范围内),Object Types选择Pawn来确保追踪只获得敌人,而不是所有场景内的物体都会被捕获。Break Hit Result节点内,Hit Actor单独做了一个判定,确保获得了一个Actor,否则返回什么都没获取。然后进入LineTraceByChannel做二次判定,由当前玩家角色位置到上个节点获得的敌人位置发射一条射线,确保两者之间没有墙等场景物体的遮挡。

如果以上两次判定均成功,则返回已获得目标的结果,将获得的Actor变量传递到Return节点内。由外部蓝图做其它工作。

关于切换锁定目标,如果获取敌人做的足够好的话,只需要重新执行一次获取敌人功能即可,这也是我为什么设置Ignore Targets变量的原因。

 

(来自角色蓝图)

 

二、锁定敌人

锁定敌人方面有一个缺点就是需要每帧都调用此功能。基于Tick事件来每次调用节点获得最新的敌人位置并调整角色及摄像机轴向。

RInterp To是个首选节点来调整摄像机的观看轴向,Interp Speed变量数字越大,轴向调整速度越快,数字越小速度越慢,与敌人轴向越大这一副作用越明显。此变量是Float属性,也就是说支持小数,具体数值的大小自行摸索最佳。

接下来使用Set Control Rotation 来设置玩家角色轴向,并且记住此处需要把玩家的Movement Component下的Orient Rotation to Movement设为False。

然后继续使用LineTraceByChannel来追踪玩家与敌人之间的位置和遮挡,来决定是否返回被遮挡。

(来自锁定蓝图)


(来自角色蓝图)

 

三、取消锁定

这方面的判定依照项目更多变化一些,我自己这边主要做了遮挡与距离判定和长按取消锁定。主要思路就是,在取消锁定时,通知敌人父类Class来取消锁定,清空当前锁定目标,将判定锁定的布尔值设为False。即在之前锁定敌人时对角色做的判定与修改设置做一个反向修改。将部分值还原为锁定前的状态。

 

其它资料:

参考视频:https://www.youtube.com/watch?v=D7r12VBs8Qs

https://www.youtube.com/watch?v=RSTctK1u1nM&t=9s

 关于追踪的相关引擎文档:https://docs.unrealengine.com/latest/INT/Gameplay/HowTo/UseRaycasts/Blueprints/index.html

UE4敌人AI的一点初探究

UE4的AI严重缺乏相关的教程和文档,在搞AI的时候可谓是进了一大堆坑,然后在各种文档和教程中慢慢退坑。在各种试错的初期,各种五花八门的方法都试了一下,最终选择敌人的攻击招式写在敌人的蓝图里,行为树来Roll点数选择攻击模式的大方向中。目前来看,这样的方式是最好的。敌人蓝图与AI蓝图和行为树通讯的时候,使用Cast to功能即可。考虑到个人的游戏是类黑魂向的,所以远程型的敌人暂不考虑。敌人初始化状态,使用了Enum列表,此列表与AI蓝图和行为树共享,方便蓝图与行为树之间通讯。

类似巡逻等简单的行为,我选择直接在敌人蓝图内写好相关事件节点,在拖到编辑器内直接选择相关Enum初始化即可。同时在视野侦察方面,我选择了内置的PawnSensing功能的OnSeePawn事件来检测玩家是否进入视野,同时此功能还有噪音获取相关的事件,我还没有细化所以暂且不探究相关内容。

所以敌人的行为大概为:在关卡内初始化–>根据初始化内容来巡逻或在原地等待–>发现玩家–>通知AI蓝图进入战斗状态并运行行为树。

攻击招式同样建立了Enum来选择,目前仅仅是普通攻击,暂未加入连招等攻击方式。Roll点数与玩家距离来决定攻击方式,并且使用行为树Service来控制AI行为。虽然现在仅仅是早期阶段,看起来AI运行的还不错。

 

视频中的敌人在攻击距离上还有点问题,除此之外,作为一个杂兵级的AI雏形表现的还不错。

 

一些坑:

  • 每次在Roll到新的行动时,要清除已存在的黑板键值,否则会按照默认的从左到右模式执行,如果行为多了这种方法会很蛋疼,在考虑寻找更多的教程和解释来按照期望的方式执行。
  • 行为树的AI除了选择行为方式外,不做任何攻击等判定,判定全部交给蓝图来做。
  • 攻击等行为调用在任务蓝图中使用Cast To来完成。
  • 需要一个相同种类、或者是敌人的父类蓝图来驱动,否则一个敌人一个蓝图这样会造成大量低效率文件,让修改工作更蛋疼。