(本文为翰者学堂学员 陈杰 投稿)

虚幻的AI系统是作为单独的一个对象独立出来的(行为树),事实证明这也的确是非常明智的,AI的行为用树状来表示,对于人类思维是非常友好的表现形式。

负责AI的开发者们,只需要利用程序设计师事先建立好的函数、事件分发器、暴露出来的变量等接口进行行为规划,同时我们可以通过黑板(Blackboard)进行类似蓝图一样的记录变量操作,并以此操控变量。接下来,我们将使用简单的RPG的机器人AI浅析下行为树系统。

 

先看一下最终的效果:

https://www.bilibili.com/video/av25876783

 

作为一个RPG,简单AI的行为分为两种主要形态,如下图所示:

主要通过是否锁定敌人的标记来区分状态,首先我们在黑板建立敌人(Enemy)变量,通过这个变量的存在与否来控制AI的两种状态,因此两种状态是有顺序的,我们选用Selector来分支,类似这样:

我们这时候就可以思考未发现敌人AI应该做的事情,例如巡逻,在一定范围里警戒敌人等等。因为此时这些动作都是等同的(即同一种状态下没有任何因素,导致Task的发生与否),我们就选用Sequence的节点来进行分支,建立两个Task事件:一个是找寻敌人,一个是巡逻,最终效果如下:

下图为两个Task的主要实现节点:

FindEnemy Task返回到黑板一个Object值Enemy:

Find_NavPoint Task返回到黑板的一个Vector值NavPoint:

考虑下发现敌人后怎么处理呢?可以简单处理如下:

因为我们一直在对距离进行判断,所以我们可以建立一个判断距离的 DistanceWithEnemy Service返回到黑板一个距离的Float值Distance:

通过距离的数值调用不同的Task事件就能简单的完成这个RPG的简单AI,明显这些Task不是同等的(即同等状态下,事件Task的发生与否是有条件的),我们此时就选用Selector来分支状态:

再回去看看逻辑图,我们分别制作相应的Task如下:

首先是

以上move,rotation都是虚幻内置的Task

接下来↓:

AIFire Service(这里用Service是为了我的连招判定,大家也可以写Task)调用人物上自己写的攻击函数:

然后是↓:

ClearEnemy Task 修改黑板的Enemy、Distance值等:

最后行为树的效果如下:

对应的逻辑图如下:

一个简单的RPGAI就制作出来了,如果你有需要,还可以添加寻找武器,捡起武器,武器子弹不足,换弹夹,扔枪等等动作,其基本原理都是相通的。

那么接下来,这部分就交给大家发挥自己的想象了!

 

需要本项目蓝图的朋友,可以申请下方的学习QQ群,获取下载地址。 

 

 

公众号二维码

 

 

让天下没有难学的技术

 

公众号:虚幻学堂

QQ群 : 453114825

腾讯课堂:丁树凯ue4

翰者学堂:www.hanzhe.com