Behavior Designer – 一个好用的行为树插件
【简介】
Behavior Designer 是一个行为树插件。可以让设计师,程序员,美术人员方便使用的可视化编辑器。 Behavior Designer 提供了强大的 API 可以让你轻松的创建 tasks(任务),配合 uScript 和 PlayMaker 这样的插件,可以不费吹灰之力就能够创建出强大的 AI 系统,甚至连一行代码都不用写。
【官网学习地址】
http://www.opsive.com/assets/BehaviorDesigner/videos.php
官网视频从行为树基础到插件的使用再到各个例子的讲解,挺详细,易上手。
【一个把官方文档总结翻译成中文的博客】
1,什么是行为树(What is a Behavior Tree)
2,概述(overview)
3,行为树设计师插件组件(Behavior Tree Component)
4,代码方式创建行为树组件(Creating a Behavior Tree from Script)
5,行为管理器(Behavior Manager)
6,任务(Tasks)
7,父任务(Parent Tasks)
8,创建任务(Writing a New Conditional/Aciton Task)
9,调试(Debugging)
10,变量(Variables:1,Global Variable,; 2,Creating Shared Variables; 3,Accessing Variables from non-Task Objects)
11,条件终止(Conditional Aborts)
12,事件(Events)
13,外部行为树(External Behavior Trees)
14,网络(Networking)
15,任务引用(Referencing Tasks)
16,变量同步(Variable Synchronizer)
17,任务内部属性(Task Attributes)
18,默认动作任务(Task list–Action)
19,默认复合任务(Task List–Composites)
20,默认条件任务(Task List–Conditionals)
21,默认装饰任务(Task list–Decorators)
22,基本内置任务列表(Task List–Basic Tasks)
【关于Conditional Abort】
条件终止(Conditional Aborts)允许你的行为树可以动态的响应改变,而不要大量杂乱的使用Interrupt/Perform去中断任务, 这个功能非常类似Unreal Engine 4引擎里面的观察者终止功能(如果你用过UE4就可以了解到)。 其他大多数行为树插件的实现方式是重新运行整个行为树,而条件终止则采用了更加优化的方式来实现,不需要重新运行整个行为树。
具体来说就是,当条件任务发生改变的时候,会根据设置的Abort Type来终止相关任务,然后按照行为树的运行设置去运行其他任务。
一共有4种条件终止类型:不终止(None),自我终止(Self),低级别终止(Lower Priority),双向终止(Both)。
类型 | 图示 | 功能 |
None不终止 | 不进行条件终止 | |
Self自我终止 | 可以终止同一个父节点下的Action类型的任务 | |
Lower Priority低级别终止 | 设置成低级别终止的任务,具有比其他任务更高级的级别,当该任务条件发生改变时,可以终止其他任务 | |
Both双向终止 | self和lower priority一起使用 |
Conditional Abort其实挺让人头晕的,特别是当多个嵌套起来,简直搞事。通过例子可能会有更深的了解。
(例1.官方例子
·没有勾选RestartWhenComplete时:当Conditional条件返回Failure的时候行为树结束。 Sequence的Abort Type为 None 时:Conditional条件为一次行为,若为Success则执行Wait,直到Wait结束(在Wait执行中Conditional变为Failure也不影响Wait执行);若为Failure则直接结束。 Self :Conditional条件为循环行为,若从Success变为Failure,会打断Wait。 Lower Priority:Conditional条件为一次行为,若从Success变为Failure,会打断Sequence以后节点继续执行(但是这里Sequence后没有节点,所以对这个树来说没有影响)。 Both :Conditional条件为循环行为,若从Success变为Failure,会打断Sequence以下和以后的节点继续执行(在这里表现上和Self一样)。
·当勾选RestartWhenComplete时: Sequence的Abort Type为 None 时:当每次Restart时,检测Conditional条件;若在Wait节点,Conditional条件改变,不会影响Wait继续执行。 Self :当Conditional条件改变时,Sequence以下节点会立即暂停并根据Conditional做出反应。 Lower Priority:当Conditional条件改变时,Sequence以后节点会立即暂停并根据Conditional做出反应。(但是这里Sequence后没有节点,所以对这个树来说没有影响)。 Both :结合Slef和Lower Priority。
(例2.
(说明:黑色方块会在2秒后开始线性移动到红色方块的位置; 一开始方块不在圆柱体的视线范围内,当方块移动到近中间位置时,会进入圆柱体视线范围; 在圆柱体Seek方块的过程中,方块在某一时刻会离开圆柱体视线范围。
(Cylinder行为树中Sequence的Abort Type选择: None:因为一开始不在视线范围内,所以一直在Idle状态,没有能打断Idle节点的条件,所以不再进入Sequence节点。 Self:同None Lower Priority:当Cube进入视线后,会打断Idle,进行Seek操作;在Seek中Cube离开视线时,没有能打断Seek节点的条件,所以还是执行Seek操作。 Both:当Cube进入视线后,会打断Idle,进行Seek操作;在Seek中Cube离开视线时,会打断Seek,进入Idle。
【参考链接】
2.Unity BehaviorDesigner BehaviorTree 的Conditional Abort机制解读