1:创建ai蓝图类
让怪物按照我们定义的逻辑运动,需要为怪物增加AI控制器,创建一个怪物AI控制器蓝图类:
2:为需要被ai控制的蓝图装上ai控制器
创建之后在需要被AI控制的蓝图中的细节面板中搜索AI,将我们刚刚创建的控制器作为这个蓝图的控制器:
这时就可以在AI控制器中写逻辑了
一般在其中添加运行行为树节点,然后创建一个行为树,在行为树中写AI逻辑,也就是想让怪物怎么运动:
3:创建行为树
如上操作完成后,在行为树中写移动逻辑
比如想让怪物在没看到主角时随机游荡,看到主角后向主角方向移动
4:ai感知组件
首先在怪物蓝图中添加组件:ai感知组件
然后调其参数:
然后往下滑找到组件的事件分发器:
可以在此写上逻辑,比如
首先循环一波,将输出的对象判断是否为主角,如果是,就将主角设为黑板键
黑板在行为树中创建,黑板具体的作用:
这里需要的应该是存储信息的作用,存储了主角这个角色信息,方便后面对目标角色进行处理
黑板可以设置键值,后面设置一个键值为目标玩家,目的是为了将黑板作为一个判断条件去执行,如果有目标玩家就执行,没有就执行下一个。
有时候找不到黑板键在哪创建,可能是因为创建黑板键的窗口隐藏了,在窗口界面找一下应该就能发现:如下:
5:行为树逻辑
先看行为树:
在根出创建一个选择器,行为树的执行顺序是从上往下,从左往右,所以左边先执行,也就是如果附近没有主角,怪物不向主角移动。这时就执行随机移动那边的逻辑
黑板的作用是当做条件,首先把黑板键改成目标玩家,如果ai感知器事件更新,也就是怪物视野中出现主角,黑板的条件就会变成真,也就是会执行下面的逻辑
如果附件在感知范围内有主角,就会执行怪物向玩家移动,再攻击主角。
6:怪物朝目标移动
具体逻辑:
这里的instigator是怪物的pawn类引用(应该是,不太懂),拿到pawn后转换为角色总类,因为后面需要判断怪物的状态,也就是是否已死亡或者处于被击中,只用这个instigator肯定是拿不到这些状态数据的,所以需要类型转换,转换完后创建一个变量,这里名字先叫ai自己,变量类型设置为角色总类的数据类型,创建此变量的目的是方便后面拿到角色数据,不用每次都先获取instigator再类型转换。
往下:
直接拉出ai自己,获取他的状态,如果没有死亡或者没有被打,就进行下面的逻辑,否则直接结束了。
如果判断要继续执行,那么拉出ai move to节点,就是怪物要移动到哪
输入的pawn就是之前创建的instigator,直接拉过来就行。下面的destination是移动的目的地:
捋一下:需要怪物在看到玩家后向玩家移动,并且要在能打到玩家的地方停下来,然后实现对主角的击打动作,然后完成执行,进行下一次。
具体如下:
这里的变量目标玩家是创建的变量,类型选择黑板键值,方便后面获取怪物的目标
拉出将黑板值作为actor获取,这样就能拿到目标的actor,然后获取其位置,将这个位置加上怪物的攻击距离。怪物的攻击距离是一个浮点值,因此需要再获取怪物的向前向量,将这个向量乘以距离这个值,最后将加起来的结果连到destination上,在将下面的半径设置为75,因为75是怪物攻击距离,这样到达攻击距离就停止了下来,这个半径是值停止执行的半径,所以将其设置为0是一样的效果,但大于半径就会导致怪物走到主角面前就停止了,因为没达到攻击距离攻击不了
最后在判断一下,如果角色本身已经处于怪物攻击距离内了,就可以不用移动,就是立即停止移动,否则就继续执行aimoveto的内容了:
最后补充:要让怪物进行ai移动,还需要设置可导航的范围:
这个放置出来之后就可以调整ai导航寻路范围了
到这怪物向玩家移动的逻辑暂时完成