- Home /
EditorWindow: How to Serialize variables after PLay
Hi. So I've searched countless of times for a solution to this problem, but I wasnt really able to find or understand how to work (around?) this. In practise:
I have an EditorWindow which has a variable of an object I want to make GUI of, for example:
class MyEditorWindow extends EditorWindow{
var targetObject:Foo;
function OnGUI(){
targetObject.myVar = FloatField(targetObject.myVar);
if (GUI.changed)
EditorUtility.SetDirty(targetObject);
}
@MenuItem("MyEditor/OpenEditor")
static function OpenWindow(targetObject:Foo){
var window = GetWindow(MyEditorWindow);
window.targetObject = targetObject;
window.Show();
}
}
All works good etc. Then I hit Play and everything has been decoupled. I still see my EditorWindow GUI and change the float for example from the control, but it doesnt refer to the targetObject anymore. So anyone know hot to work this?
Thanks, I believe I was prety clear on the issue :-) and hopefully other get help as well.
(PS: Foo is MonoBehaviour)
What is Foo? Is it a $$anonymous$$onoBehaviour script? Because "normal" classes aren't serialized on their own. They are serialized along with a $$anonymous$$onoBehaviour or ScriptableObject
The issue is not that targetObject (Foo) is no sierializing the changes done from the editor, but rather that the editor window looses the connection with the targetObject as sson as I enter play mode
Hmm, no matter what i do i can't reproduce what you describe. What exactly do you mean by "decoupled"? I suggest you add an ObjectField in your EditorWindow. That way you can click on the ObjectField to highlight the object that it holds.
EditorGUILayout.ObjectField(targetObject, Foo);
Note: this is a "readonly" object field, so you can't change the targetObject variable with it. If you want that (for debugging) use this:
targetObject = EditorGUILayout.ObjectField(targetObject, Foo) as Foo;
I've tried something similar to your example and it works as expected. Editing assets will permanently change the prefab. Editing scene objects will do the change. Editing during runtime also changes the object but it's of course reverted once you stop playmode since you have just a copy of the scene at runtime and the original scene is deserialized when you re-enter edit mode.
$$anonymous$$ay i ask you how you open the window? Because $$anonymous$$enuItems doesn't work on functions with parameters.
Answer by ajkolenc · Jan 11, 2017 at 10:26 PM
I know this is kind of old, but I was experiencing the same problem and I found the solution.
Any variables you want to persist after you press play need to be serialized by Unity. Since it doesn't really make sense to have public variables on an EditorWindow, this means prefacing your private variables with the [SerializeField]
attribute. This allows Unity to store the value and reload it after you finish playing.
Your answer
Follow this Question
Related Questions
Change Image/Icon Shown for Asset in Project/Asset Window? 0 Answers
Editor Window Serialization not Working as Expected 2 Answers
Editable non-monobehaviour objects 1 Answer
Creating persistent object in Edit mode 1 Answer
OnSerialize event 2 Answers