【U3D】Behavior Designer中的复合节点(Composites Node)

本系列文章由CSDN@萌萌的一天 出品,未经博主允许不得转载。  



一:Behavior Designer中的Composites Node


复合(Composites )是行为树中的重要概念,一个复合节点下面必须有至少一个的子节点,它的返回状态取决于它子节点的状态。下面是一个简单的AI例子,实现了敌人看到玩家并进行追击的功能:

【U3D】Behavior Designer中的复合节点(Composites Node)_第1张图片

可以看到,一个行为树中可以有多个复合节点,任意节点下可以包含多个复合节点,通过这种方式,我们可以对许多的行为进行合理有序的组合,从而产生清楚的行为逻辑。

Composites Node下包含多种的复合节点类型,下面进行逐一说明:

Parallel Node:

同时运行它的所有子节点,当所有的子节点返回True,则它自己将会返回True。如果有至少一个子节点返回False,那么它自己将会返回False。如果有至少一个子节点返回Running那么它自己将会返回Running。
【U3D】Behavior Designer中的复合节点(Composites Node)_第2张图片

上述例子可以看到,Parallel Node下有四个子任务(吃饭、等待10s、碎觉、打豆豆),当运行行为树之后这四个任务会并行运行,后台会同时有三个Log输出,当“等待10s”任务完成后,Parallel Node将会返回True给上一级的节点。

Selector Node:

Selector Node类似于编程语言中的"or"语句操作, 当至少有一个 子节点返回True,则它自己将会返回True。 如果所有的子节点返回False,那么它自己将会返回False。 如果有至少一个子节点返回Running那么它自己将会返回Running。

Sequence Node:

Sequence Node类似于编程语言中的"and"语句操作,当所有的子节点返回True,则它自己将会返回True。如果有至少一个子节点返回False,那么它自己将会返回False。如果有至少一个子节点返回Running那么它自己将会返回Running。

Parallel Selector Node:

Parallel Selector Node类似于Selector Node,当至少有一个子节点返回True,则它自己将会返回True。不过有区别的是,Parallel Selector Node会并行运行它所有的子节点,如果有一个子节点返回True,那么它自己则将会返回True,并结束其它所有的子节点(其它子节点返回False)。如果所有的子节点返回False,它自己将会返回False。如果有至少一个子节点返回Running那么它自己将会返回Running。
【U3D】Behavior Designer中的复合节点(Composites Node)_第3张图片

上述例子可以看到,Parallel Selector Node下有四个等待任务,分别等待10s、20s、30s、40s,当第一个等待任务完成后(经过10s之后),其它的等待任务会停止进行,Parallel Selector Node自己返回True。

Priority Selector Node:

Priority Selector Node类似于Selector Node,当至少有一个子节点返回True,则它自己将会返回True,并结束其它所有的子节点(其它子节点返回False)。不过有区别的是,Priority Selector Node会并行运行它所有的子节点。如果所有的子节点返回False,它自己将会返回False。如果有至少一个子节点返回Running那么它自己将会返回Running。

如果要使用此节点类型,你需要对子节点的优先级进行设置。设置方式是需要重写GetPriority()方法,它返回Float类型,当返回值越大,则表示优先级越高,越先进行执行。
 public override float GetPriority()
        {
            return base.GetPriority();//此处重写<span style="font-family: 'Microsoft YaHei';">GetPriority()方法</span>

        }


Random Selector Node:

Random Selector Node类似于Selector Node,当至少有一个子节点返回True,则它自己将会返回True,并结束其它所有的子节点(其它子节点返回False)。不过有区别的是,Random Selector Node会按照随机顺序运行它所有的子节点,它会打乱所有的子节点执行顺序。如果所有的子节点返回False,它自己将会返回False。如果有至少一个子节点返回Running那么它自己将会返回Running。

Random Sequence Node:

Random Sequence Node类似于Sequence Node,当所有的子节点返回True,则它自己将会返回True。不过有区别的是,Random Sequence Node会按照随机顺序运行它所有的子节点,它会打乱所有的子节点执行顺序。如果有至少一个子节点返回False,那么它自己将会返回False。如果有至少一个子节点返回Running那么它自己将会返回Running。

Selector Evaluator Node:

Selector Evaluator Node是一种特殊的节点类型,它将会运行优先级最低的子节点。如果有高优先级的子节点处于Running状态,下一帧有个低优先级的子节点想要运行,则会中断高优先级的子节点任务。

----------------------------------------------------------------------------------------------------------------------

二:Composites Node中的Abort Type

Abort Type,即中止(打断)类型,是复合节点上自带的属性,我们可以在Inspector面板上对它进行设置。

【U3D】Behavior Designer中的复合节点(Composites Node)_第4张图片

其中包含了四种类型:None、Self、Lower Priority、Both。

None:

表示不会进行任何中止操作,是默认的中止类型。此状态下行为树不会产生任何中断方法,会按照顺序依次对节点进行运行操作。


Lower Priority:

Lower Priority表示低优先级子节点的中断操作。当一个Composites Node的Abort Type设置为Lower Priority,那么当此复合节点不处于Running状态并且它的低优先级同级节点处于Running状态时,会每帧对此Composites Node的子状态条件进行检查,如果子状态条件检查成功,会打断其它的任务,优先运行Composites Node的子节点。以下是以一个简单的例子进行说明:

【U3D】Behavior Designer中的复合节点(Composites Node)_第5张图片

该例子是判断一个物体是否看见玩家,如果看见则进行追击操作,追击成功后会原地进行等待。现在我们给Sequence 的Abort Type添加Low Priority类型。可以看见,Sequence图标左上方会有个向右的箭头,即表示比它优先级低的同级任务。

现在我们运行此行为树观察一下它的状态:

【U3D】Behavior Designer中的复合节点(Composites Node)_第6张图片

由于开始时此物体并没有看到玩家,所以“Can See Object”返回为False,根据Sequence节点的特性它自己也会返回False,从而执行“Wait”方法。然而由于Sequence节点是Low Priority类型,会每帧对Sequence的子节点状态,即“Can See Object”进行检查(“Can See Object”上有个红色圈带X的标记即表示每帧对它进行检查),只要当某帧物体看到玩家后,"Can See Object”条件判断成功,就会打断其它任务的运行,执行之后的追击方法,如下图:


【U3D】Behavior Designer中的复合节点(Composites Node)_第7张图片

Self:

Self表示我对自身的子节点进行中断操作,当一个Composites Node的Abort Type设置为Self,那么当此复合节点不处于Running状态并且它的低优先级同级节点处于Running状态时,会每帧对此Composites Node的子节点状态条件进行检查,如果子状态条件检查成功,会打断其它的任务,优先运行Composites Node的子节点。然而如果运行子节点时,Composites Node的子节点状态判断失败,则会打断它自身的运行。

还是以上述例子为例,当物体对玩家进行追击时,一旦物体看不到玩家了,即"Can See Object”条件判断失败,则会打断追击方法的执行,从而中止Sequence。

Both:

Both是代表同时存在Self和Low Priority打断类型,判断方式会更加灵活。











你可能感兴趣的:(Designer,csdn,behavior,U3D)