主要参考:文档原文
Unity 允许通过自定义 Inspector 和 Editor Windows 来扩展编辑器。
并且可以通过自定义的 属性绘制器 来定义属性在 Inspector 中的显示方式。
一、创建编辑器窗口(EditorWindow)
1、创建继承自 EditorWindow 的类 MyWindow。(脚本必须放在“Editor”文件夹下)
2、在 MyWindow 的 OnGUI 函数中编写 GUI 控件。可使用 GUI、GUILayout、EditorGUI、EditorGUILayout类,并且可以随意混合搭配使用。
3、通过调用 EditorWindow.GetWindow(typeof(MyWindow)) 展示。 (标准、可停靠)
4、也可通过调用 EditorWindow.GetWindowWithRect(typeof(MyWindow), Rect.zero) 展示,以显示地指定位置和区域。
二、属性绘制器(PropertyDrawer)
用途1、对特性为 Serializable 的类的 Inspector 进行自定义。
public class XXX { }
[CustomPropertyDrawer(typeof(XXX))] //CustomPropertyDrawer 告知 Unity 应该作为哪个类的属性绘制器
public class XXXDrawer : PropertyDrawer
{
EditorGUI.BeginProperty(position, label, property);
//...
EditorGUI.EndProperty();
}
用途2、配合 PropertyAttribute,影响脚本成员在 Inspector 上的显示。
public class XXX
{
[YYY]
public int a;
}
public class YYYAttribute : PropertyAttribute { }
[CustomPropertyDrawer(typeof(YYYAttribute))]
public class YYYDrawer : PropertyDrawer
{
void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
MyRangeAttribute range = (MyRangeAttribute)attribute;
//...
}
}
注意:出于性能原因,EditorGUILayout 函数不能用于属性绘制器!
三、自定义编辑器
1、脚本增加特性 [ExecuteInEditMode] 可在编辑器下运行。
2、创建自定义编辑器。
public class XXX : MonoBehaviour { }
[CustomEditor(typeof(XXX))] //CustomEditor 告知 Unity 应该作为哪个组件的编辑器
[CanEditMultipleObjects] //CanEditMultipleObjects 告诉 Unity 您可以使用此编辑器来选择多个对象并同时更改所有对象
public class XXXEditor : Editor //必须继承Editor
{
//实现此函数以创建自定义检视面板。
public override void OnInspectorGUI() { }
//实现此方法可创建您自己的交互式自定义预览。
public override void OnInteractivePreviewGUI(Rect r, GUIStyle background) { }
//实现此方法可为检视面板、主编辑器标头和对象选择器的预览区域创建自己的自定义预览。
public override void OnPreviewGUI(Rect r, GUIStyle background) { }
//如果要在预览标头中显示自定义控件,可重载此方法。
public override void OnPreviewSettings() { }
//使编辑器在场景视图中处理事件。
//注意,非override!由消息系统处理。
//注意,如果要添加 2D GUI 对象(例如:GUI 或 EditorGUI),需要将这些对象包裹在 Handles.BeginGUI() 和 Handles.EndGUI() 的调用中。
public void OnSceneGUI() { }
}
四、TreeView
用于显示可以展开和折叠的层级数据。(例如 Hierarchy视图的样式)
用到再细看。。
五、其他(自整理)
1、Unity自带PropertyAttribute的子类(源码):
ContextMenuItemAttribute: 作用于变量上,给作用的变量在Inspector上添加右键菜单方法。
InspectorNameAttribute: 作用于枚举值,更改枚举值在 Inspector 上显示的名称。
TooltipAttribute: 作用于字段,为字段在 Inspector 添加悬浮解释文字。
SpaceAttribute: 作用于所有字段,在 Inspector 添加空行像素。
HeaderAttribute: 作用于变量上,给变量在 Inspector 中添加标题头。
RangeAttribute: 作用于 int 和 float 变量,限制范围值,在 Inspector 上显示范围条。
MinAttribute: 作用于 int 和 float 约束变量最小值。
MultilineAttribute: 作用于 string ,使 string 在 Inspector 显示多行文本区。
TextAreaAttribute: 作用于 string 类型,在 Inspector 添加高度灵活可滑动的文本区。
ColorUsageAttribute: 作用于 Color 类型变量上,使其可在取色面板配置显示 Alpha 和采用 HDR 标准。
GradientUsageAttribute: 作用于 Gradient 类型变量上,配置是否支持 HDR。
DelayedAttribute: 作用于基本数据类型 float, int 和 string 上,使其在Inspector被修改时不会立即生效,而是在按下回车或移除焦点时。
-------------------------------------------------------------------------------------------------
常用重要类:Editor、EditorGUI、EditorGUILayout、EditorGUIUtility、PropertyDrawer、SerializedProperty、EditorStyles
--------------------------------
集合:TreeView、ReorderableList