Read this document in English: English Document
AkiBT是以UniBT作为基础的行为树结点编辑器, UniBT原作者为Yoshida,在前者基础上丰富了大量现代行为树编辑器功能.
- 下载最新的Release Package
- 使用git URL在Unity PackageManager中进行下载
https://github.com/AkiKurisu/AkiBT.git
- Unity 2021.3 or later.
-
Newtonsoft.Json
可在Unity PackageManager中进行下载
- 支持使用可视化节点编辑器构造行为树
- 支持运行时可视化结点状态,调试行为树
- 基于GraphView框架,非常便于拓展编辑器和自定义新的行为
- 所见即所得的编辑界面,所有字段都在图上,这也是AkiBT和其他编辑器设计方式最大的不同
-
点击
Open Graph Editor
打开结点编辑器. -
- 红色代表上次
Update
返回了Status.Failure
- 绿色代表上次
Update
返回了Status.Success
- 黄色代表上次
Update
返回了Status.Running
- 红色代表上次
-
你可以将挂载
AkiBT.BehaviorTree
的GameObject保存为预制体或保存为ScriptableObject或序列化为Json -
BiliBili 的教学视频(视频中使用的版本较老,待更新)
- 当UpdateType为
UpdateType.Auto
时,AkiBT.BehaviorTree
会在Update
定时更新子节点。 - 如果想随时更新,请将UpdateType更改为
UpdateType.Manual
并调用BehaviorTree.Tick()
; - 只有
AkiBT.BehaviorTree
是MonoBehavior
。 每个节点只是一个 C# 可序列化类。
这一部分将讲解使用AkiBT的Editor(编辑器)相关进阶技巧和知识:
你可以点击结点Ctrl+C&&Ctrl+V或右键选择Duplicate复制结点,你也可以批量选择进行复制粘贴
你可以从上侧工具栏选择Copy From SO
,也可以将BehaviorTreeSO、BehaviorTree组件或挂载BehaviorTree的GameObject、Json文件拖拽进编辑器中进行复制粘贴。
SharedVariable可以在黑板中添加,变量目前支持Float、Int、Vector3、Bool、String、UnityEngine.Object以及其继承子类型
- 字段中的SharedVariable勾选
Is Shared
出现下来菜单用于绑定行为树黑板中的共享变量
-
SharedObject支持进行类型限制,详见SharedVariable
-
双击共享变量以修改名称,为空时删除,修改后同时更新引用该变量的结点字段
-
Inspector可以对共享变量进行修改和删除
你可以在ProjectSetting中设置AkiBT编辑器或者其余继承自AkiBT的编辑器的搜索遮罩。你可以设置工作流中需要的Group类型(Group特性相关见上文),没有添加Group特性的结点不会被过滤。
将Composite结点与子节点连线尤其是重新排序时可能比较麻烦,你可以使用Composite Stack来替换传统的结点样式,内置结点中没有使用该样式的结点,如需使用你需要编写一个NodeResolver
来申明使用的结点,示例如下:
using System;
namespace Kurisu.AkiBT.Editor
{
[Ordered]
public class SequenceResolver : INodeResolver
{
public IBehaviorTreeNode CreateNodeInstance(Type type)
{
return new SequenceStack();
}
public static bool IsAcceptable(Type behaviorType) => behaviorType == typeof(Sequence);
}
public class SequenceStack : CompositeStack { }
}
这一部分将讲解使用AkiBT的Runtime(运行时)相关进阶技巧和知识:
对于同场景跨Prefab的共享变量可以使用SceneVariableScope
(MonoBehaviour)创建场景内生效的Global Variables
对于跨场景的共享变量可以使用GameVariableScope
(ScriptableObject)创建应用内生效的Global Variables
,对于打包后的游戏你需要手动从资源加载方案中加载该ScriptableObject例如使用Resources.Load()
进行加载
不同的作用域之间可以互相依赖例如SceneVariableScope
可以将GameVariableScope
设置为ParentScope从而获取应用内的全局共享变量
在Inspector中查看字段,点击Is Global
将其标记,行为树将在共享变量初始化前先绑定全局共享变量
- 标记后按钮文本为绿色
在自定义结点中,你可以使用SharedTObject<T>
来创建一个泛型对象(UnityEngine.Object)共享变量,其绑定逻辑与SharedObject
相同,可见IBindableVariable<T>
,好处是你可以拥有更安全的类型检查
运行时可以在Inspector或编辑器中修改共享变量从而调试行为树,全局变量需要在其相应作用域进行修改
在Editor中使用Json序列化会保存引用UnityEngine.Object
(以下简称UObject)对象的GUID,而Runtime时Json反序列时无法获取UObject对象,你需要在Runtime通过别的方式加载所需要的UObject对象,例如将行为树中对UObject的引用全部改为SharedTObject<T>
和SharedObject
,在Runtime通过其名称从你的资源加载方案中获取,例如Addressable
的资源地址或AssetBundle
的文件路径。
查看 API文档
查看 API文档
你可以使用AkiBTDSL实现运行时或在项目外更方便编辑行为树, 可导出成便于阅读和修改的DSL(文本特定领域语言)格式,例如方便建立Excel表格统一编辑、将行为树编辑环境和项目环境分离
插件目前内置了新的User Service(Tools/AkiBT/AkiBT User Service), 提供了两个功能Serialize Service和Search Service
由于AkiBT使用ScriptableObject进行数据存储,在修改结点的字段名称时会导致数据的丢失(该问题可以通过在修改字段上添加FormerlySerializedAsAttribute
进行避免)。而对于结点的名称、命名空间进行修改后也会导致整个结点无法被反序列化,从而丢失该结点以及之后结点的所有数据。批量序列化为Json后,你可以使用文本编辑器批量对结点Ctrl+F进行修改,再使用Serialize Service重新批量反序列化为ScriptableObject。
需要注意的是, 并非所有的字段都被序列化,Serialize Service只对行为树的结点和共享变量进行序列化,反序列化同理,继承类型的字段需要你额外进行处理。
选择结点类型快速找到使用该结点的所有行为树, 结合Serialize Service可以同时找到对应的Json文件。