• 25_ue4进阶末日生存游戏开发[行为树进阶]


    我们上两节写了两种的巡逻方式。

    我们用第一个方法。所以我们还原一下行为树。

    现在测试一下:发现了一个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 ,立马放弃运行下面的叶子节点。

     

    测试:成功。 

  • 相关阅读:
    【责任链设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    C++——模板
    经验模态分解(Empirical Mode Decomposition,EMD)(附代码)
    在MyBatis中,可以使用动态SQL语句来实现对数据的上移、下移和置顶操作
    uniapp 微信小程序之隐私协议开发
    视频播放 (二) 自定义 MediaPlayer
    react事件与原生事件的区别
    Python每日一练(牛客数据分析篇新题库)——第37天:合并
    oracle sql monitor简单使用说明
    企业应用集成
  • 原文地址:https://blog.csdn.net/zhang2362167998/article/details/126088806