【U3D】Behavior Designer中的复合节点(Composites Node)
2016-05-05 09:40
369 查看
本系列文章由CSDN@萌萌的一天 出品,未经博主允许不得转载。
一: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类似于SelectorNode,当至少有一个子节点返回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类似于SelectorNode,当至少有一个子节点返回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类似于SelectorNode,当至少有一个子节点返回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面板上对它进行设置。
其中包含了四种类型: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打断类型,判断方式会更加灵活。
相关文章推荐
- node.js JS对象和JSON字符串之间的转换
- NodeJS的Promise的用法解析
- 在Node.js中使用Javascript Generators详解
- Nodejs学习item【入门手上】
- node.js mongoose的安装和使用
- Xcode7.3.1中SKAudioNode在Scene转换后无声的问题
- Xcode7.3.1中SKAudioNode在Scene转换后无声的问题
- Xcode7.3.1中SKAudioNode在Scene转换后无声的问题
- 19.Remove Nth Node From End of List(7.54%)
- python 和 nodejs 比较
- nvm node 版本管理器的安装
- LeetCode OJ 116. Populating Next Right Pointers in Each Node
- ActiveMQ 入门Nodejs版
- ActiveMQ + NodeJS + Stomp 极简入门
- Permission denied: user=root, access=WRITE, inode="hadoop":hadoop:supergroup:rwxr-xr-x
- Nodejs学习item 3 -- module模块系统与npm包管理
- 美团酒店Node全栈开发实践
- Xcode7.3中SKAudioNode"诡异"初始化的解决
- Xcode7.3中SKAudioNode"诡异"初始化的解决
- Xcode7.3中SKAudioNode"诡异"初始化的解决