- Home /
Handling Undo/REdo in EditorWindow when editing DB record.
Unity: 4.6.3f1 on OsX. I am building a dialog editor window into Unity, when the editor opens up the user can choose a dialog to edit. Once a dialog is selected my code loads the dialog from a SQLite3 database and news a dialog model object.
The EditorWindow then displays the GUI elements for the fields in the dialog model. My problem seems to be that generic Objects can't be used in the Unity's undo/redo system.
[Serializable()]
public class DialogModelNode : UnityEngine.Object
{
...
[SerializeField]
private string _title; // the title of this node
...
public string title { get {return _title;} set { dirty |= (string.Compare(value, _title) != 0); _title = value;}}
...
}
Editor Code
String val;
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(new GUIContent("(" + root.rootID + ")Title:","The title of this Dialog (Designer only)"), GUILayout.Width( 60));
EditorGUI.BeginChangeCheck();
val = EditorGUILayout.TextField(root.root.title);
if (EditorGUI.EndChangeCheck ())
{
Debug.Log("Undo " + root.root != null);
Undo.RecordObject (root.root, "Edit Dialog Title");
root.root.title = val;
EditorUtility.SetDirty (root.root);
}
EditorGUILayout.EndHorizontal();
When this code executes I get the following error "Undo object may not be null." even though the preceding log statement shows true.
What is the best way to handle Undo/Redo in this case? Is it possible to create by own Undo/Redo records and get events called on it when they are undone or redone?
Any help would be useful, I have been googling and have found several examples un Undo/Redo code but they don't seem to function in this case and I am not sure why?
Thanks - Robert.
After more investigation it really comes down to why this happens?
Undo.RecordObject (root.root, "Edit Dialog Title");
this produces "Undo object may not be null." error even though none of the parameters are null.
What causes this error? Is it something within root.root that is null?
I created a simple test case that produces this error.
public class Test : UnityEngine.Object
{
[SerializeField] public string text;
}
...
if (EditorGUI.EndChangeCheck ())
{
Test t = new Test();
t.text = "new test";
Undo.RecordObject (t, "Edit Dialog Title");
EditorUtility.SetDirty(t)
}
And the output is Undo object may not be null. UnityEditor.Undo:RecordObject(Object, String)
and this for the SetDirty call.
NullReferenceException RPGDialog.DialogEditor.OnGUI_Edit_RootNode (RPGDialog.EditorDialog$$anonymous$$odel root) (at Assets/RPGDialog/Scripts/Editors/DialogEditor_Edit_RootNode.cs:34)
Your answer
Follow this Question
Related Questions
Insert new custom class element with _default_ values to a SerializedProperty array? 1 Answer
How do i stop my Editor window values from reseting? 0 Answers
Custom Timeline Playable - GUI Override 0 Answers
How to add a reorderable list on CUSTOM EDITOR WINDOW? 0 Answers
EditorGUILayout.TextField text get's deleted instantly. 2 Answers