我有一个自定义编辑器脚本,该脚本具有一个枚举,用于定义应用程序应以设置模式还是实时模式启动。如果将枚举设置为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标记为脏。当我找到其他人对此问题的解决方案时,此方法已更改,但它似乎对我没有任何帮助。
答案 0 :(得分:1)
MainControllerEditor类未序列化,没有位置。所以
public IsSetupEnabled SetupEnabled;
。 如果要存储一些数据,则需要在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