当前位置:   article > 正文

Unity AI行为树插件Behavior Designer_sequence 和selector

sequence 和selector

1.行为树基础

官方文档
行为树中常用的有三类,分别是decorator、sequence和selector。decorator下只执行一个节点,sequence下会按照从左到右的顺序执行多个节点,selector是从多个节点中选择一个执行。
在这里插入图片描述
如何为物体添加行为树呢?有两种方式,第一种是直接AddCompontent,第二种是选中目标物体后在行为树界面右键选择AddBehaviorTree。
在这里插入图片描述
行为树有四个属性面板,如下图在这里插入图片描述
分别是行为树属性,任务(行为),全局参数和监视面板。

Variables面板可以设置全局参数,点击点就可以应用了。
在这里插入图片描述

在这里插入图片描述
Variables面板下声明的公共变量我们也可以用代码进行获取和修改。

behaviorTree.GetVariable("MyVariable"); 
behaviorTree.SetVariable("MyVariable", value); 
behaviorTree.SetVariableValue("MyVariableName", value); 
  • 1
  • 2
  • 3

在这里插入图片描述

行为树常用Task的有如下三种。Parallel是多个子节点同步执行,Sequence是从左到右依次执行,Selector相当于是if,执行首个可以执行的节点。
在这里插入图片描述
我们可以简单的测试下各个模块的效果。
在这里插入图片描述

2.Action和Conditional的简单讲解

如果要灵活运用行为树,那么肯定要编写自己的功能模块。下面简单介绍下Action和Conditional的使用。
首先需要引用行为树的类库。

using BehaviorDesigner.Runtime;
using BehaviorDesigner.Runtime.Tasks;
  • 1
  • 2

然后继承Action或Conditional。要注意如果需要设定行为树中使用的公共变量前面要加Shared,使用时用.Value获取值,比如声明了SharedInt num,使用时就是num.Value。生命周期函数和unity生命周期函数差不多,比较常用的是OnUpdate(),其余可以参照官方文档。记得生命周期要返回TaskStatus。下面写了个求随机数的Action。

public class TestAction : Action
{
    public SharedInt num;

    public override TaskStatus OnUpdate()
    {
        num.Value = Random.Range(1, 10);
        return TaskStatus.Success;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

我们通过在Variables声明一个公共int参数然后绑定给num来打印num的值。如下图。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Conditional和Action用法差不多,可以配合selector使用。下面直接上代码。

public class TestConditional : Conditional
{
    public override TaskStatus OnUpdate()
    {
        return TaskStatus.Failure;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

selector会从左到右执行一个成功的路线,类似if。
在这里插入图片描述

3.知识点补充

如果我们需要在不同情况下执行行为树,就可以在检视面板上勾选相应的选项,比如开始时执行那就勾选Options下的Start When Enabled,如果需要行为树执行完一遍就重新执行就勾选Restart When Complete。
在这里插入图片描述
还有一个很重要的知识点就是Tasks下Composites的AbortType选项,一共有四种类型,分别为None、Self、LowerPriority和Both,AbortType意味中断类型,它可以允许你的行为树动态的改变,使用它就可以根据行为树状态的改变中断当前执行状态重新执行其他符合条件的节点。如果选择的是Self,那么比如该Composites“下一级”的节点状态发生变化后会执行满足条件的节点,如果选择的是LowerPriority就是判断“同级”。Both就是兼含前两者。

Tasks任务下Decorators中是对节点修饰作用的,比如下图中的Inverter就是将其下节点的结果取反。子节点的任务完成后返回值,在这个节点会被取反并传递到上一级中。
图中的AbortType是中断自身,如果Sequence下的左侧状态发生变化则会重新执行Sequence节点。
在这里插入图片描述
下图的AbortType是LowerPriority,会中断优先级低(右侧)的行为。如果CanSeeObject能看到目标则会执行Seek,Seek执行完后会执行GameOverAction。如果看不到就会执行Patrol巡逻。因为使用了AbortType机制所以执行是动态改变的。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/110542
推荐阅读
相关标签
  

闽ICP备14008679号