• 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

     

     

  • 相关阅读:
    hdoj 6023 Automatic Judge
    hdoj 1170 Balloon Comes!
    初识vim操作和配置
    POJ 1611 The Suspects (并查集)
    HDU 1232 畅通工程 (并查集)
    计蒜客--两数之和
    计蒜客--爬楼梯 (动态规划)
    计蒜客--单独的数字 (位运算)
    计蒜客--最后一个单词的长度
    计蒜客-- 奇怪的国家 (位运算)
  • 原文地址:https://www.cnblogs.com/01zxs/p/9863715.html
Copyright © 2020-2023  润新知