I need to repaint an EditorWindow when the user performs undo/redo.
But I don't see any callbacks or events associated with undo/redo...
How can I do this?
asked Nov 06 '10 at 03:57 PM
This seems to work:
Add this to OnGUI(). I have it in a switch since I'm reacting to other events as well... You can debug log the commandName to get the name of the command you're interested in (that's how I found UndoRedoPerformed).
EDIT: This method turns out to be unreliable since only the active window gets the event. IOW, if the user performs undo/redo with another window active, my EditorWindow never gets the event.
It's sort of okay(-ish) for repaint since the editor window will repaint anyway when it gets focus again, but unfortunately I need to do some other stuff too (re-initialize some data). So if you need to intercept undo/redo reliably, this doesn't work.
Internally it seems that unity uses an Undo callback, but it's not exposed for tool developers :(
I'll see what I can do about making EditorApplication.undoRedoPerformed public. If you want to go cowboy here, you can try it out by registering your own callback on that event trough reflection.
I would never suggest you do this for runtime code, but for editorcode there is less risk. Please note that the reason we keep certain things internal are usually:
If you can live with those two constraints, give this a shot.
See http://stackoverflow.com/questions/3120422/how-to-attach-event-handler-to-an-event-using-reflection for inspiration on how to register for events using reflection.
PPS2: on every domain reload (when you press play), you will need to register your eventhandler again, events are not serialized by Unity.
answered Nov 24 '10 at 11:37 AM
Lucas Meijer 1 ♦♦
I didn't manage to grab the events from
Note that I'm working with