所编辑类名 + Editor
,例如当我需要自定义类StateMachine
的Inspector窗口时,我将在Editor目录下创建StateMachineEditor.cs
[CustomEditor(typeof(T))]
。目的是告知编辑器类该编辑器所针对的运行时类型,此例中,需要告诉编辑器我们想要修改类StateMachine
的Inspector窗口,故T
为StateMachine
StateMachineEditor
继承类Editor
// StateMachineEditor.cs
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(StateMachine))]
public class StateMachineEditor : Editor
{
public override void OnEnable() {}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
}
}
OnEnable()
函数将在每次查看对应的Inspector时被调用,故可用来初始化编辑器所需要的变量。常用的有两种类型的变量
private StateMachine selectMachine;
private SerializedProperty property1;
private SerializedProperty property2;
// ...
本例中selectMachine
用于存取编辑器获得的需要编辑的类
private void OnEnable()
{
selectMachine = target as StateMachine;
if (selectMachine == null)
{
Debug.LogError("Editor Error: Can not translate selectMachine");
}
}
target
是继承的Editor
类中的一个字段(get)。本身为Object
类型,在拆箱后可以转换成上文Attribute:CustomEditor
中的T
,用来显示类中原本不会被绘制到Inspector窗口的信息,达到自定义的功能
public override void OnInspectorGUI()
{
// 之前
base.OnInspectorGUI();
// 之后
}
base.OnInspectorGUI()
会执行默认Inspector信息的绘制,若去除Inspector面板将空无一物。可以根据项目需求,选择将自定义代码写在”之前“或”之后“的位置,本例中将代码写在”之后“,也就是说新自定义添加的属性,将在Inspector的底部被绘制
若要完全自定义Inspector面板,通常会选择不调用基类的函数,直接重写整个面板的绘制代码
目前暂时只考虑前者,两者的区别在后续自定义Window时再介绍
EditorGUILayout用于在Inspector面板上绘制信息
EditorGUILayout.Space();
用于在面板中生成一小段间隙,功能可以类比Attribute:[Space]
EditorGUILayout.LabelField("");
用于在面板中生成一串文字
EditorGUILayout.BeginHorizontal();
// Codes...
EditorGUILayout.EndHorizontal();
在上述代码范围内开启一段水平空间,在此范围内的信息将被绘制在同一行
EditorGUILayout.BeginVertical();
// Codes...
EditorGUILayout.EndVertical();
在上述代码范围内开启一段垂直空间,在此范围内的信息将被绘制在同一列
// StateMachineEditor.cs
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(StateMachine))]
public class StateMachineEditor : Editor
{
public override void OnEnable()
{
selectMachine = target as StateMachine;
if (selectMachine == null)
{
Debug.LogError("Editor Error: Can not translate selectMachine");
}
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Current StateName:");
EditorGUILayout.LabelField(selectMachine.CurrentState.StateName);
EditorGUILayout.EndHorizontal();
}
}
成果如下,在底部生成了一串文字标签,显示当前状态的名字(当前无状态,故为Null)
原文:https://www.cnblogs.com/tuapu/p/14757924.html