前言
自定义inspector脚本界面是一个比较实用开发技巧,本篇博客用于记录我实际用到过的相关知识(不定期更新)。
基本知识1.Editor开发需要引用UnityEditor 2.自定义界面的类前面需要加上特性 [CustomEditor(typeof(“需要编辑的类名”))] 3.覆写界面的类是一个独立的类,一会下面示例中可以看到,类名随意 4.这个类要继承Editor 5.编辑器类要放在Editor文件夹中,不然项目打包的时候会报错。或者在类的前面加上 #if UNITY_EDITOR,判断当前的环境,具体参照下面示例。二者任选其一
1.根据枚举显示内容和代码
public enum TestEnum
{
A,
B
}
///要被重写界面的类
public class Test : MonoBehaviour
{
public TestEnum t;
public int num;
public float f;
public Vector3 v;
}
#if UNITY_EDITOR
[CustomEditor(typeof(Test))]
public class TestEditor : Editor
{
public override void OnInspectorGUI()
{
var test = target as Test;//可以用test访问Test类的内容
//在面板显示枚举t,这里记得要赋值,不然会导致界面与数据分离
test.t = (TestEnum)EditorGUILayout.EnumPopup("type",test.t);
switch (test.t)
{
case TestEnum.A:
test.num = EditorGUILayout.IntField("int",test.num);//显示int
test.f = EditorGUILayout.FloatField("float",test.f);//显示float
break;
case TestEnum.B:
test.v = EditorGUILayout.Vector3Field("vector3",test.v);//显示Vector3
break;
}
}
}
#endif
效果
还有另一种方式可以实现同样的效果,暂时不清楚两种方式的区别。个人更喜欢第一种。 代码
#if UNITY_EDITOR
[CustomEditor(typeof(Test))]
public class TestEditor : Editor
{
private SerializedObject thisClass;
private SerializedProperty type;
private SerializedProperty num;
private SerializedProperty v;
private SerializedProperty f;
private void OnEnable()
{
thisClass = new SerializedObject(target);
type = thisClass.FindProperty("t");
num = thisClass.FindProperty("num");
f = thisClass.FindProperty("f");
v = thisClass.FindProperty("v");
}
public override void OnInspectorGUI()
{
thisClass.Update();//更新面板信息
EditorGUILayout.PropertyField(type);
if(type.enumValueIndex == 0)
{
EditorGUILayout.PropertyField(num);
EditorGUILayout.PropertyField(f);
}
if(type.enumValueIndex == 1)
{
EditorGUILayout.PropertyField(v);
}
//应用修改后的数据,不调用无法赋值
thisClass.ApplyModifiedProperties();
}
}
#endif
显示数组和List
if UNITY_EDITOR
[CustomEditor(typeof(SkillTreePanel))]
public class SkillTreePanelEditorInspector : Editor
{
//序列化对象
private SerializedObject _serializedObject;
//序列化属性
private SerializedProperty _assetLstProperty;
public override void OnInspectorGUI()
{
var t = target as SkillTreePanel;//目标类
//使用当前类初始化
_serializedObject = new SerializedObject(t);
//获取当前类中可序列化的属性
_assetLstProperty = _serializedObject.FindProperty("skillDatas"); //将类中skillDatas变量序列化
EditorGUILayout.PropertyField(_assetLstProperty, true); //显示
_serializedObject.ApplyModifiedProperties(); //应用修改
}
}
#endif
2.在脚本界面显示button,点击执行对应方法
这个按钮无论是否运行中都能执行。 代码
if (GUILayout.Button("TestButton"))
{
Debug.Log("Test");
}
效果 点击后
GUI、GUILayout、EditorGUI、EditorGUILayout使用介绍