自定义检查器枚举重置

时间:2018-06-21 21:20:20

标签: unity3d unity3d-editor

我有一个自定义编辑器脚本,该脚本具有一个枚举,用于定义应用程序应以设置模式还是实时模式启动。如果将枚举设置为no,则在单击play时,应用程序可以正常使用no选择,但是枚举又恢复为yes状态,退出播放模式时,枚举又返回yes状态,并且而不是播放前选择的状态。这是我的脚本。

[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();
        }
    }
}

我曾尝试在Gui中将枚举标记为Serializable并将mainController标记为脏。当我找到其他人对此问题的解决方案时,此方法已更改,但它似乎对我没有任何帮助。

2 个答案:

答案 0 :(得分:1)

MainControllerEditor类未序列化,没有位置。所以

public IsSetupEnabled SetupEnabled;

每次创建MainControllerEditor的新实例时,都会重置

。 如果要存储一些数据,则需要在MainController类中进行处理(它将被序列化为prefab或保存在Scene中)或使用Playerprefs / EditorPrefs

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

答案 1 :(得分:1)

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

然后将通过内置序列化对其进行序列化,保存和加载。

public enum IsSetupEnabled
{
    Yes,
    No
};

public IsSetupEnabled SetupEnabled;

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

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

[HideInInspector]
public IsSetupEnabled SetupEnabled;
#endif