Emilia-BehaviorTree是基于Emilia-NodeEditor与NPbehavior实现的Unity行为树节点编辑器
NPbehavior实现
运行时和编辑器分离
可视化调试
热重载
Unity版本:2021.3+
Odin版本:3.1.2+
在Tag界面中选择对应版本 Tag界面
找到.unitypackage文件进行下载
导入Unity之后在PackageManager界面中安装Editor Coroutines
打开Packages/manifest.json
将以下内容添加进manifest文件中
"com.emilia.kit": "https://github.com/CCEMT/Emilia-Kit.git?path=Assets/Emilia/Kit",
"com.emilia.node.editor": "https://github.com/CCEMT/Emilia-NodeEditor.git?path=Assets/Emilia/Node.Editor",
"com.emilia.behaviortree": "https://github.com/CCEMT/Emilia-BehaviorTree.git?path=Assets/Emilia/BehaviorTree"
基于Emilia-BehaviorTree 实现的AI行为树编辑器 AI
以下为例子中的实现
[CreateAssetMenu(menuName = "Emilia/AI/EditorAIAsset", fileName = "EditorAIAsset")]
public class EditorAIAsset : EditorBehaviorTreeAsset
{
public override string outputPath => "Assets/Emilia/AI/Resource/Config";
public override List<string[]> tags => new List<string[]>() {
new[] {BaseDefine.NodeTag},
new[] {UniversalDefine.NodeTag},
new[] {AIDefine.NodeTag}
};
}
outputFilePath:运行时文件最终保存的路径
tags:根据tag来过滤创建节点时的菜单,上面例子吧三个tag写到了三个不同的list中表示的是,如果这三个tag拥有任何一个tag的节点就可以显示在菜单中;
如果是三个tag写到了同一个list中(例:new[] {BaseDefine.NodeTag, UniversalDefine.NodeTag, AIDefine.NodeTag})表示的是,必须同时拥有这三个tag的节点才可以显示在菜单中
//创建AI的Task类型节点的基类
[NodeTag(AIDefine.NodeTag)]//在基类添加一个tag
public abstract class AITaskAsset<T> : BaseTaskAsset<T> where T : BehaviorTree.Node, new() { }
public abstract class AITask<T> : BaseTask<T> where T : NodeAsset { }
BehaviorTreeLoader behaviorTreeLoader = new BehaviorTreeLoader();
behaviorTreeLoader.runtimeFilePath = "Assets/..";
behaviorTreeLoader.editorFilePath = "Assets/..";
//这里接入自己项目里面的加载API
behaviorTreeLoader.onLoadAsset = OnLoadAsset;
//这里是反序列化(如果修改了序列化方案则需要修改,这里默认使用Odin序列化)
behaviorTreeLoader.onLoadStateMachineAsset = (bytes) => SerializationUtility.DeserializeValue<StateMachineAsset>(bytes, DataFormat.Binary);
//创建时钟
clock = new Clock();
clock.Reset(new FloatTimeInfo());//设置时钟的时间类型
string fileName = "xx";//不带后缀的文件名
this._runner = BehaviorTreeRunnerUtility.CreateRunner();
this._runner.Init(fileName, behaviorTreeLoader, clock, gameObject);
//时钟更新
FloatTimeInfo timeInfo = new FloatTimeInfo(Time.fixedDeltaTime);//时间类型
clock.Update(timeInfo);//更新时钟的时间
//运行器生命周期
runner.Start();//开始运行
runner.Update();//更新
runner.Dispose();//停止运行
email:[email protected]
QQ群:956223592