我们上两节写了两种的巡逻方式。
我们用第一个方法。所以我们还原一下行为树。
现在测试一下:发现了一个bug,当僵尸发现主角之后,就一直追着主角,因为黑板中的target一直都是主角。这是因为即使看不到主角,也不会将taget置为空值。
所以我们只能自己动手做一个服务了,我们新建一个服务。
重命名
覆写方法
我们想把目前我们用来服务的eqs 包裹进来,所以添加这个节点
以actor数组的方式返回
因为只有一个游戏角色,所以我们只需要得到第0个元素。
新增一个变量,并点亮眼睛
判断是否取到了actor,如果actor数组的长度为0,说明僵尸没有发现主角。
如果长度不等于0,那么将target赋给黑板。
否则设置空值到黑板里面。
回到行为树,删掉这个eqs服务
选择我们新创建的服务
设置该服务频率 是0.2s。
测试:僵尸看不到角色,并且出现报错。
这是因为这个过程是异步的,所以我们让run eqsquery节点执行完,在进行其他的。
这个时候我们要为他绑定事件。
连线
这里也要连一下
进入target检测的eqs,我们将僵尸的视野调到100.
测试:僵尸可以看得到我们,也可以看不到我们。但是有个bug,当加僵尸追我们到一定的地方,我们躲起来,僵尸就不动了,不自己找点了。
那是因为僵尸找随机点的eqs加了一个距离过滤,超出初始点一定的范围的点就是无效点了。所以僵尸就不会动了。
解决方法,添加一个强制执行的装饰器。
这样的话,僵尸就会move to到上一个点。
测试:僵尸会回到上一个点,但是在这个过程中不会理玩家。
优化:修改树的子部分的优先级
这里设为self,当target为is set ,立马放弃运行下面的叶子节点。
测试:成功。