首先,你的类定义是错误的。如果要将其附加到游戏对象上,则需要
[Serializable]
或该类应继承自
MonoBehaviour
。无论哪种情况,请删除
()
。
[Serializable]
public class MyScript
{
public bool A;
public bool B;
}
或者
public class MyScript : MonoBehaviour
{
public bool A;
public bool B;
}
请注意,
自定义编辑器
仅适用于继承自
MonoBehaviour
或
ScriptableObject
的类。在其他情况下,您需要实现
自定义属性绘制器
。
请尽量不要直接更改target
。您要处理很多东西,如标记为脏、撤消/重做等...
而是始终通过SerializedProperty
进行操作。
还要注意,base.OnInspectorGUI();
将绘制默认的检查器。
假设MyScript
是一个MonoBehaviour
类。
[CustomEditor(typeof(MyScript))]
public class MyEditor : Editor
{
SerializedProperty a;
SerializedProperty b;
private void OnEnable()
{
a = serializedObject.FindProperty("A");
b = serializedObject.FindProperty("B");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(a);
if(a.boolValue)
{
EditorGUILayout.PropertyField(b);
}
serializedObject.ApplyModifiedProperties();
}
}
如果 MyScript
实际上不是一个 MonoBehaviour
,那么可以将其作为 PropertyDrawer
使用。这两者的原理基本相似,只是在使用字段时必须始终使用带有位置参数 Rect
的 EditorGUI
版本:
[CustomPropertyDrawer(typeof(MyScript), true)]
public class MyEditor : PropertyDrawer
{
private bool isUnFolded;
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
isUnFolded = EditorGUI.Foldout(new Rect(position.x, position.y, position.width, EditorGUIUtility.singleLineHeight), isUnFolded, label);
position.y += EditorGUIUtility.singleLineHeight;
if (isUnFolded)
{
EditorGUI.indentLevel++;
var a = property.FindPropertyRelative("A");
var b = property.FindPropertyRelative("B");
EditorGUI.PropertyField(new Rect(position.x, position.y, position.width, EditorGUIUtility.singleLineHeight), a);
position.y += EditorGUIUtility.singleLineHeight;
if (a.boolValue)
{
EditorGUI.PropertyField(new Rect(position.x, position.y, position.width, EditorGUIUtility.singleLineHeight), b);
}
EditorGUI.indentLevel--;
}
}
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
var height = 1;
if(isUnFolded) height += (property.FindPropertyRelative("A").boolValue ? 2 : 1);
return height * EditorGUIUtility.singleLineHeight;
}
}