Unity 编辑器选项弹出窗口? (Unity 编辑器更新选项)

Unity Editor Option Popup? ( Unity Editor update Option )

问题是我有很多不同的选项,而且这些选项只会出现一次。 我有一个下拉菜单,有两个选项。 (滑块、复选框)

!!滑块!! 如果选择了滑块,我希望在编辑器中提供以下选项。 (最小值、最大值、默认值)

!!复选框!! 如果选中复选框,我想在编辑器中有以下选项。 (检查)

z.b:

我已经尝试影响编辑window。 (https://docs.unity3d.com/ScriptReference/EditorGUILayout.FadeGroupScope.html) 但是因为我只想扩展一个选项,不想创建一个新的window,这个选项一直没有太大帮助。

问题是,我该如何设计更多的选项并带走? 统一版。 2018.4.8f1

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;




public class uitest : MonoBehaviour
{
    public enum TestType { Slider, CheckBox };
    public TestType test = TestType.Slider;
    //[SerializeField]
    private bool Check = false;
    //[SerializeField]
    private int MinValue = 0;
    //[SerializeField]
    private int MaxValue = 3;
    //[SerializeField]
    private int defaultValue = 2;

}

您必须为您的类型提供自己的 Editor。将其作为 uitesteditor.cs 放置在名为 Editor 的目录下,位于 Assets.

有了 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 枚举值。