目标:创建节点
首先
节点的资源,我们会用到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 "";