从零开始写一个行为树编辑器(3)

目标:创建节点

 

首先


节点的资源,我们会用到Unity编辑器内置的GUIStyle,效果蛮不错的.

我个人选用的是 未选择框(flow node 1 )和 选中框(flow node 1 on

 

废话不多说,开始撸代码吧


先创建编辑化节点,为了跟源代码彻底分离开,以及我们不需要序列和反序列化运行时行为树,我们另外创建一套编辑器化节点,编辑器化节点里面会添加源代码节点所需的参数,将这些参数显示在行为树右侧面板,我们会在序列化编辑器行为树的时候把这些参数都保存下来,也会在生成代码的时候使用这些参数来动态生成代码。

1.编辑器化--枚举节点类型创建

    public enum EditorNodeEnum
    {
        Composite,
        Decorator,
        Task,
        Root,
    }

2.编辑器化--枚举错误类型创建

    public enum ErrorType
    {
        Warn,
        Error,
        None
    }

3.编辑器化--枚举常量定义

    public class EditorNodeConst
    {
        /// <summary>
        /// 装饰节点 一般可添加子节点
        /// </summary>
        public const int Normal_Decorator_CanAddNode = 1;
        /// <summary>
        /// 复合节点 一般可添加子节点
        /// </summary>
        public const int Normal_Composite_CanAddNode = 999;
        /// <summary>
        /// 任务节点 一般可添加子节点
        /// </summary>
        public const int Normal_Task_CanAddNode = 0;               
    }

4.编辑器化--基础节点

    [Serializable]
    public abstract class EditorNode
    {
        public EditorNode()
        {
        }

        /// <summary>
        /// 归属图形化节点
        /// </summary>
        [OdinSerialize]
        protected BTNode BelongNode { get; set; }

        /// <summary>
        /// 节点真实类型
        /// </summary>
        /// <returns></returns>
        public abstract Type GetNodeType();

        /// <summary>
        /// 节点类型
        /// </summary>
        [OdinSerialize]
        public abstract EditorNodeEnum NodeEnum { get; }

        /// <summary>
        /// 节点是否有效
        /// </summary>
        /// <returns></returns>
        public abstract ErrorType GetIsVaild();

        /// <summary>
        /// 可添加节点数量
        /// </summary>
        public abstract int CanAddNodeCount { get; }

        /// <summary>
        /// 设置属于的图形节点
        /// </summary>
        /// <param name="node"></param>
        public void SetBelongNode(BTNode node)
        {
            BelongNode = node;
        }

        /// <summary>
        /// 处理特殊的属性
        /// </summary>
        /// <param name="sb"></param>
        protected void DealField(StringBuilder sb)
        {
        }

        /// <summary>
        /// 输出代码格式
        /// </summary>
        /// <returns></returns>
        public abstract string ToChild();
    }

5.编辑器化--基础装饰节点

    public abstract class Decorator : EditorNode
    {
        public override EditorNodeEnum NodeEnum
        {
            get { return EditorNodeEnum.Decorator; }
        }

        public override int CanAddNodeCount
        {
            get { return EditorNodeConst.Normal_Decorator_CanAddNode; }
        }

        public override string ToChild()
        {
            return "";
        
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值