您必须为您的类型提供自己的Editor。将其作为 uitesteditor.cs 放置在 Assets 某处名为 Editor 的目录下。
使用public 成员(或访问者),无需太多 Unity 巫术就可以完成此代码。
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(uitest))]
[CanEditMultipleObjects]
public class uitesteditor : Editor
{
static string[] customProperties = new string[] { "Check", "MinValue", "MaxValue", "defaultValue" };
public override void OnInspectorGUI()
{
serializedObject.Update();
// Draw common properties (by excluding all custom ones)
// Could be skipped if there is none such.
DrawPropertiesExcluding(serializedObject, customProperties);
var uitarget = target as uitest;
// Custom UI based on selected enum
switch (uitarget.test)
{
case uitest.TestType.CheckBox:
uitarget.Check = EditorGUILayout.Toggle("Check", uitarget.Check);
break;
case uitest.TestType.Slider:
uitarget.MinValue = EditorGUILayout.IntField("Min value", uitarget.MinValue);
uitarget.MaxValue = EditorGUILayout.IntField("Max value", uitarget.MaxValue);
uitarget.defaultValue = EditorGUILayout.IntField("Default value", uitarget.defaultValue);
break;
}
// Needed only by DrawPropertiesExcluding
serializedObject.ApplyModifiedProperties();
}
}
如果您想使用 SerializeField 对私有字段进行操作,则需要更多样板代码。我们使用SerializedProperty 实例来访问private 序列化字段,因此代码可能看起来不太可读。
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(uitest))]
[CanEditMultipleObjects]
public class uitesteditor : Editor
{
static string[] customProperties = new string[] { "test", "Check", "MinValue", "MaxValue", "defaultValue" };
SerializedProperty test, check, MaxValue, MinValue, defaultValue;
private void OnEnable()
{
test = serializedObject.FindProperty("test");
check = serializedObject.FindProperty("Check");
MinValue = serializedObject.FindProperty("MinValue");
MaxValue = serializedObject.FindProperty("MaxValue");
defaultValue = serializedObject.FindProperty("defaultValue");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
// Draw common properties (by excluding all custom ones)
DrawPropertiesExcluding(serializedObject, customProperties);
EditorGUILayout.PropertyField(test);
switch ((uitest.TestType)test.intValue)
{
case uitest.TestType.CheckBox:
EditorGUILayout.PropertyField(check);
break;
case uitest.TestType.Slider:
EditorGUILayout.PropertyField(MinValue);
EditorGUILayout.PropertyField(MaxValue);
EditorGUILayout.PropertyField(defaultValue);
break;
}
serializedObject.ApplyModifiedProperties();
}
}
注意:我添加了CanEditMultipleObjects 标签,但如果需要,您应该自行决定。渲染的检查器 GUI 将使用来自所选第一个对象的 test 枚举值。