播放时自定义检查器枚举重置

Custom inspector enum reset on play

我有一个自定义编辑器脚本,它有一个枚举来定义应用程序是否应该启动到设置模式或实时模式。如果我将枚举设置为否,当我点击播放时,应用程序在没有选择的情况下正常工作,但随后枚举恢复到是状态,当我退出播放模式时,枚举又回到是状态,并且不是播放前选择的状态。这是我的脚本。

[CustomEditor(typeof(MainController))]
public class MainControllerEditor : Editor
{
    public enum IsSetupEnabled
    {
        Yes,
        No
    };

    public IsSetupEnabled SetupEnabled;

    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();
        GUI.changed = false;
        var mainController = (MainController)target;

        SetupEnabled = (IsSetupEnabled)EditorGUILayout.EnumPopup("Setup Enabled", SetupEnabled);
        if (GUI.changed)
        {
            switch (SetupEnabled)
            {
                case IsSetupEnabled.Yes:
                    mainController.SetupEnabled(true);
                    break;
                case IsSetupEnabled.No:
                    mainController.SetupEnabled(false);
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }

        if (GUILayout.Button("Validate Configuration"))
        {
            mainController.Validate();
        }
    }
}

当我找到其他人遇到的此问题的解决方案时,我曾尝试将枚举标记为可序列化并将 mainController 标记为脏,但它似乎对我没有任何帮助。

MainControllerEditor class 没有序列化,没有地方放那个。所以

的状态

public IsSetupEnabled SetupEnabled;

每次创建 MainControllerEditor 的新实例时都会重置。 如果你想存储一些数据,你需要在 class MainController 中进行(它将被序列化为预制件或保存在场景中)或使用 Playerprefs/EditorPrefs

public override void OnInspectorGUI()
{
    DrawDefaultInspector();
    GUI.changed = false;
    var mainController = (MainController)target;
    mainController.SetupEnabled=GUILayout.Toggle(mainController.SetupEnabled);
}

您可以将 SetupEnabled 变量从 MainControllerEditor 移动到 MainController。

然后通过内置序列化进行序列化、保存和加载。

public enum IsSetupEnabled
{
    Yes,
    No
};

public IsSetupEnabled SetupEnabled;

要使您的变量不显示在检查器中(但被序列化)并且不在运行时执行:

#if UNITY_EDITOR
public enum IsSetupEnabled
{
    Yes,
    No
};

[HideInInspector]
public IsSetupEnabled SetupEnabled;
#endif