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