Unity Behavior Tree Editor 行为树编辑器初级实现

泪湿孤枕 提交于 2019-12-03 14:56:48

Unity Behavior Tree Editor 行为树编辑器初级实现

编辑效果如下
这里写图片描述

编辑器脚本最好和行为树脚本分离。
需要存储的信息有:节点类型、子节点数组、(条件节点、行为节点需要特殊编辑)

数据存储在 NodeAsset 中,只需要包存一个根节点即可(从跟节点可以找到所有节点)

[System.Serializable]
public class NodeAsset : ScriptableObject
{
    [SerializeField]
    public NodeValue nodeValue = null;
}

// 节点数据
[Serializable]
public class NodeValue
{
    // 根节点
    public bool isRootNode = false;
    // 节点类型
    public NodeType NodeType = NodeType.Select;
    // 子节点集合
    public List<NodeValue> childNodeList = new List<NodeValue>();
    // 叶节点脚本名
    public string componentName = string.Empty;

    // 条件节点、行为节点描述(辅助查看)
    public string description = string.Empty;
    // 节点位置(编辑器显示使用)
    public Rect position = new Rect(0, 0, 100, 100);
    
    /// <summary>
    /// 是否为有效节点, isRelease = true 为已经销毁的节点,为无效节点
    /// </summary>
    public bool isRelease = false;
    /// <summary>
    /// 删除节点时调用
    /// </summary>
    public void Release()
    {
        isRelease = true;
    }
}
NodeAsset 继承 ScriptableObject 的好处是可以将 NodeAsset 存储为 *.asset 类型文件

这里写图片描述

理论上 组合节点:顺序节点、选择节点、随机节点、并行节点、修饰节点 等是不需要配置任何数据的,因为遍历逻辑全部是已经写好的。所以实际中只需要读取 NodeAsset 配置文件,从根节点开始遍历所有节点,将每个节点根据类型实例化为 行为树节点,将父子节点按照配置文件添加,最终只需要得到一个行为树的根节点,执行根节点就行了。

private NodeRoot GetNodeRoot(NodeValue nodeValue)
    {
        NodeRoot nodeRoot = null;
        switch (nodeValue.NodeType)
        {
            case NodeType.Select:    // 选择节点
                nodeRoot = new NodeSelect();
                break;
            case NodeType.Sequence:  // 顺序节点
                nodeRoot = new NodeSequence();
                break;
            case NodeType.Decorator: // 修饰节点
                nodeRoot = new NodeDecorator();
                break;
            case NodeType.Random:    // 随机节点
                nodeRoot = new NodeRandom();
                break;
            case NodeType.Parallel:  // 并行节点
                nodeRoot = new NodeParallel();
                break;
            case NodeType.Condition: // 条件节点、需要特殊处理
                nodeRoot = GetLeafNode(nodeValue);
                break;
            case NodeType.Action:    // 行为节点、需要特殊处理
                nodeRoot = GetLeafNode(nodeValue);
                break;
        }
        return nodeRoot;
    }

条件节点和行为节点 一般需要配置一些参数,比如 血量 小于 100, 饥饿值 > 50, 等
如何灵活配置,目前还没想好怎么处理,目前还是一个半成品

操作如下 Window 下添加菜单 CreateTree
这里写图片描述

在空白区域鼠标右键 Add Node
这里写图片描述

添加子节点:选择一个节点 Make Transition (条件节点、行为节点为叶子节点,不能添加子节点)
这里写图片描述

一个行为树只能有一个根节点,任何节点都可以随时改变节点类型
通过枚举选择节点类型
这里写图片描述

代码链接

有比较好的实现方案或者建议请留言,对Unity编辑器脚本使用的不够熟练,在功能实现上有了很大的限制。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!