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

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

本文转载自http://blog.sina.com.cn/s/blog_c0e6ab9b0102wxkj.html

只是做个记录,

 

一:Behavior Designer中的Composites Node

 

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

 

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

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

Parallel Node:

同时运行它的所有子节点,当所有的子节点返回True,则它自己将会返回True。如果有至少一个子节点返回False,那么它自己将会返回False。如果有至少一个子节点返回Running那么它自己将会返回Running。
 
上述例子可以看到,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。
 
上述例子可以看到,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类型,当返回值越大,则表示优先级越高,越先进行执行。
[csharp] view plain copy
 
  1. public override float GetPriority()  
  2.        {  
  3.            return base.GetPriority();//此处重写GetPriority()方法  
  4.   
  5.        }  

 

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状态,下一帧有个低优先级的子节点想要运行,则会中断高优先级的子节点任务。

parallel complete(子节点竞争)

1:所有子节点全部为running状态时返回running,

2:子节点中任意一个返回成功或失败,则立刻返回相同结果,并停止运行所有子节点

Decorators (修饰节点,可以接一个子节点)


Conditional Evaluator:判断所设置的条件,如果条件返回成功则执行它的子节点,不成功则返回失败。

 
Interrupt:和Perform Interruption配合使用,可以终止Interrupt的所有子节点的运行。

 
Inverter:将子节点的返回值取反。 
Repeater:重复子节点的运行。 
Return Failure:不论子节点的返回值而返回失败。 
Return Success:不论子节点的返回值而返回成功。 
Task Guard:设置子节点多久能被访问。 
Until Failure:重复执行子节点直到返回失败。 

Until Success:重复执行子节点直到返回成功。

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

二:Composites Node中的Abort Type

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

 

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

None:

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

 

Lower Priority:

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

 

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

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

 

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

 

Self:

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

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

Both:

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


 

猜你喜欢

转载自blog.csdn.net/qq_33347809/article/details/115182828