木木的Unity学习笔记(一)—— 重写UGUI Editor(Button举例)
昨天聊天的时候,有一位道友说自己无论是对字段进行公有化处理还是加上SerializeField标签都无法把自己的字段序列化显示到Unity的Inspector面板上,因为是要在Unity的UGUI中的ScrollRect组件面板上显示,所以另外一位道友提供了一个解决方案,就是继承重写ScrollRectEditor类,下面用UGUI中的Button类来举一个例子。
首先在Unity的Project面板上创建一个新文件夹Script,在该文件夹下创建一个新的脚本,我的命名是ButtonEx,Editor,并在该文件夹下创建一个新的脚本,我的命名是ButtonExEditor,结构如下图所示:
关于Editor文件夹,这里引用雨松大佬的一段话:Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以。比如目录:/xxx/xxx/Editor 和 /Editor 是一样的,无论多少个叫Editor的文件夹都可以。Editor下面放的所有资源文件或者脚本文件都不会被打进发布包中,并且脚本也只能在编辑时使用。一般呢会把一些工具类的脚本放在这里,或者是一些编辑时用的DLL。 比如我们现在要做类似技能编辑器,那么编辑器的代码放在这里是再好不过了,因为实际运行时我们只需要编辑器生成的文件,而不需要编辑器的核心代码。编辑ButtonEx.cs脚本,代码如下:
using UnityEngine;
using UnityEngine.UI;
[AddComponentMenu("UI/ButtonEx", 30)]
public class ButtonEx : Button {
// 我们自定义的需要显示在面板上的变量
[SerializeField] private int exProp;
}
- 编辑ButtonExEditor.cs脚本,代码如下:
using UnityEditor; // 因为是修改Unity编辑器所以需要继承UnityEditor类
using UnityEditor.UI;
[CustomEditor(typeof(ButtonEx), true)]
[CanEditMultipleObjects]
public class ButtonExEditor : ButtonEditor {
private SerializedProperty exProp;
protected override void OnEnable()
{
base.OnEnable();
exProp = serializedObject.FindProperty("exProp");
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
EditorGUILayout.Space();
serializedObject.Update();
EditorGUILayout.PropertyField(exProp);
serializedObject.ApplyModifiedProperties();
}
}
在Hierarchy面板创建GameObject空对象,并在此对象的Inspector面板中Add Component添加ButtonEx组件,ButtonEx组件可以直接搜索到,或者在UI下找到。
添加ButtonEx组件,会发现ButtonEx组件和Unity自带的UGUI Button组件面板很相似,但是多了一个我们自定义的变量Ex Prop,下面是我们自定义的ButtonEx组件:
下面是Unity自带的UGUI Button组件:
以上便解决了那位道友的问题,可喜可贺。