前言:
1.本插件编辑器部分纯使用Unity自带的EditorGUI,GUI开发,序列化使用LitJson+ScriptableObject,没有用到其他的插件。
2.本插件由萌新 颠佬-水汪汪10多天纯手搓完成,本人先是写了一个“嵌入式”的节点编辑器基类,让它可以“嵌入”在任何EditorWindow窗口,然后再此基础上写一个行为树节点编辑器,实现行为树节点可视化编辑和动态监视功能。
为什么要这样搞?因为我后面还要做更多的插件
3.本插件刚刚写完,可能还有诸多我没有察觉的BUG,性能问题也没有办法保障
4.本插件永久免费,并且长期更新。
开源地址:
gitee:https://gitee.com/waterwangwang/BTWaterDog
插件下载
本插件使用条件:
掌握行为树的理论基础,了解行为树的执行逻辑,以及每个节点怎么搭配使用
本插件已经实现的节点:
使用流程
1.先创建好一个AI预设体,这个预设体用来做
2.编写一个脚本,这个脚本实现AI逻辑,比如攻击/巡逻/移动等等执行的方法,然后挂载到这个预设体上。
例如我下面写了一个辣鸡AI脚本,包括了攻击/巡逻/追击方法 以及 判断是否满足攻击条件 追击条件
3.打开行为树编辑器,开始捣鼓节点,创建呀。。连线啊。。
目前只要打开这个行为树编辑器,后台就会疯狂每帧Repaint(),会使笔记本电脑风扇狂转 (悲
※此可视化节点编辑器操作:
选中某节点:在节点处,鼠标左键单击一次就行
拖动某节点:在节点处,长按左键进行拽动鼠标
移动窗口视角:在空白处,长按右键进行拽动鼠标
编辑某节点:在节点处,鼠标右键单击一次就行,然后可以选择连线,删除等等
弹出创建菜单:在空白处,鼠标右键单机一次就行,然后可以选择创建
编辑节点的属性:鼠标左键双击节点的参数!注意是双击!为了防误触,单击编辑不了
目前品控挺辣鸡,而且不能缩放这些节点大小,就很恶心🤪
4.可以在行为节点处绑定对象,选择方法了(这里是用反射得到这个AI物体上所有的脚本组件,然后再反射得到所有组件的每个public无参方法)
※条件节点只能绑定无参的bool返回类型方法,动作节点只能绑定无参的void返回类型方法※
5.在捣鼓完所有节点后,点击左边保存按钮,选择Asset中一个地方保存即可。保存后的文件有两个,一个行为树驱动数据.asset,和一个行为树节点数据.json,一定要检查好,行为树驱动数据里要绑定有行为树节点数据,里面的预制体一定要对!!
※强烈建议保存在Resources文件夹,不然有可能打包出去加载不了,不知道为什么,后面会解决这个问题※
6.在保存后,在正常情况下,AI预制体会自动添加行为树AI驱动器脚本,并自动关联行为树驱动数据文件。此时,已经全部完成!!
7.然后可以开始运行了,检查执行情况了。在点击"Play"情况下,才能使用动态监测功能
动态监测可以实时查看哪些节点正在执行,哪些节点没有执行
8.如果想要再次编辑某节点文件,只需在行为树驱动文件.asset中打开编辑器修改即可,别忘了保存哦
实机演示视频:
流程:
动态监视:
目前问题:
1.可视化节点编辑器不能缩放节点大小,此功能还没有做
2.每个AI对象初始化时都需要递归加载AI节点数据文件,性能开销可能有点大,建议使用对象池来进行复用
开发中遇到的大坑
1.深度序列化问题:当初想直接使用ScriptableObject直接存节点对象,节点对象在装子节点对象,无限套娃!但发现我太天真了,Unity不支持深度序列化,最多到第10层好像,再往下数据就缺失了!!
解决思路:采用线性结构存储树形结构数据。采用字典来存储每个节点,标注唯一id来查找,绑定父子节点。
不知道解决思路对吗,求大佬解答
2.序列化时候不能父类装子类,如果使用父类装子类,那么子类对象特有的属性字段数据就会缺失,无论我使用ScriptableObject、LitJson、JsonUtility都遇到这个问题
求大佬给个解决思路
本插件开源拓展思路:
全民制作人大家好,我是练习时长两年半的Unity个人练习生,修为尚浅,类规划不好
我写的每个脚本的类、属性、方法、字段都写了详细的注释
水汪汪傻鸟命名法:
m开头是方法 t_m表示总方法 list是列表 dic是字典 b表示bool类型变量
BaseWindow为所有窗口基类,我以后写新的编辑器窗口都会继承它们
- 节点编辑器拓展
- Dropmenu是下拉菜单,基类是VisualDropmenu
- NodeEditor中BaseNodeEditor是节点编辑器基类
- Node 里的VisualBaseNode是所有节点的基类
以上继承基类重写