• Unity 行为树-中断机制


    一、中断类型

    设置了中断之后,行为树会检测执行过的子条件节点,当条件节点的状态发生变化时,会中断正在执行的Running节点,转而立即执行该条件节点。

    行为树的打断类型有4种:

    • None
    • Self
    • Lower Priority
    • Both

    二、类型详细介绍

    (1)Self:打断自己的直接子节点

    • 当前分支处于Running状态
    • 必须是条件节点才能监听状态变化来打断别人
    • 条件节点的优先级必须比Running节点的优先级高(即在其左边)
    • 条件节点必须是当前组合节点(设置了打断类型为self的节点)的直接子节点,孙子节点都不行
    • 条件节点的状态必须发生变化才能打断。(这个好理解)

    如上图,当Selector设置了打断类型为Self的时候,一开始检测键盘某key没有按下,于是执行 Wait。 当Wait还未结束的时候,这个时候如果按下了某key,那么【Is Key Down】节点会立即执行,随后返回成功,Selector也返回成功。

     

    (2) Lower Priority:打断比自己优先级低的节点

    • 当前组合节点(设置打断的组合节点)没有在Running状态,且已经执行结束。
    • 比当前组合节点低优先级的兄弟节点所在的分支处于Running状态,也就是说当前组合节点的父节点处于Running状态。
    • 条件节点是当前组合节点的直接子节点(不包括孙子节点)。
    • 条件节点处于执行路径上。例如父节点为selector节点,只会重新评估到第一个成功的条件节点为止的节点序列。
    • 条件节点的状态发生变化。
    • 设置低优先级打断的组合节点可以嵌套。用来将孙子辈的节点加入重新评估列表。但是嵌套不能断层。

    上图中,设置打断类型为低优先级打断。一开始未按下某键,执行Wait。 当按下某key之后,打断了右侧低优先级的key。

    (有人会问,不是直接子节点才会检测吗,这个Inverter是取反,并不是条件节点。 我猜测他和Is Key Down组合起来,也是条件节点)

     

    这种嵌套也是可以检测按键按下,并中断Wait的。

     (3)Both:打断兄弟和自己

      Self和Low Priority的结合体。既会中断兄弟节点中低优先级的节点,又会中断自身孩子节点中的Running节点。


    三、简单小例子

     设定:敌人一开始在发呆。当它看见玩家之后,会去追玩家。当玩家逃脱敌人视线之后,敌人恢复到发呆状态。

     

     

    此时的行为树状态:

     

     如果这个时候,玩家向敌人移动,进入了敌人的视线。 条件判断节点【AICanSeeObj】返回成功,则行为树就会打断节点【AIDaze】,转而运行节点【AIMoveTo】。

    敌人就会向玩家移动。

     

    此时的行为树状态:

    如果中断类型仅仅设置为打断低优先级,那么 行为树会一直执行节点【AIMoveTo】。无论玩家是否逃出 了 敌人的视野范围,都是一直这么执行下去。这样显然不符合游戏逻辑设计。

    所以,还需将打断类型增加个 打断自己。这个时候,行为树会检测条件节点【AICanSeeObj】,玩家逃出敌人范围之后,自动打断节点【AIMoveTo】。

    行为树继续执行节点【AIDaze】,敌人继续发呆 (◎_◎;)


    行为树demo 项目:

    https://pan.baidu.com/s/1I2IBtou4hsystzRAAr3gUw

     

     

  • 相关阅读:
    为什么 PCB 生产时推荐出 Gerber 给工厂?
    Fedora Redhat Centos 有什么区别和关系?
    【KiCad】 如何给元件给元件的管脚加上划线?
    MCU ADC 进入 PD 模式后出现错误的值?
    FastAdmin 生产环境升级注意
    EMC EMI 自行评估记录
    如何让你的 KiCad 在缩放时不眩晕?
    KiCad 5.1.0 正式版终于发布
    一次单片机 SFR 页引发的“事故”
    java基础之集合
  • 原文地址:https://www.cnblogs.com/01zxs/p/9863715.html
Copyright © 2020-2023  润新知