我们上两节写了两种的巡逻方式。
我们用第一个方法。所以我们还原一下行为树。

现在测试一下:发现了一个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 ,立马放弃运行下面的叶子节点。
测试:成功。
版权声明:本文为zhang2362167998原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。