unity, undo
如果在操作一個Object之前調用Undo.RecordObject(Object),且操作確實造成Object某些屬性的改變,則會產生一個undo記錄。
如果我們的架構不是直接操作Object,而是操作一個ui,并在某些時機通過ui.save(Object)將數據回寫到Object,那么:
1,如果我們每幀都ui.save(Object)的話,則Object始終保持同步更新,與直接操作Object是等價的,所以只要在對ui操作之前調用Undo.RecordObject(Object),那么只要操作確實造成ui某些屬性改變(并且這個屬性是要回寫到Object的,進而導致Object相應屬性的變化),則會產生一個undo記錄。
2,如果我們嫌每幀都調ui.save(Object)太耗,改成每隔一段較長的時間才save一次的話,則Object相對于ui的更新是滯后的,那么在對ui進行操作之前調用Undo.RecordObject(Object),但要注意,在這之前應該先調用一下ui.save(Object),以便保證Record下來的快照是最新的數據,然后在執行ui的操作代碼,接著,我們應該再調用一次ui.save(Object),原因是,我們要在保證在這幀結束之前讓Object的狀態變為操作之后的最新狀態,這樣,在幀末unity就會自動對我們Record下來的快照和Object操作之后的最新狀態進行對比,如果存在差異,產生一條undo記錄。即:
ui.save(Object);//Object變成修改前的最新狀態
Undo.RecordObject(Object);//記錄Object修改前的最終狀態(狀態A)
ui.modify();//對ui進行修改
ui.save(Object);//Object變成修改后的最新狀態(狀態B)
//unity 對 狀態A 和 狀態B 進行對比,產生undo記錄
總結:
如果每幀ui.save(Object)對性能影響不是很大的話,還是每幀save比較簡單。
注:通常情況下,ui.save(Object)并不是非常耗費,所以可以每幀執行。但反過來由數據重建ui(即Object.buildUI(ui))是比較耗費的,所以Object.buildUI(ui)應只在個別時機才調用。
----補充:
當執行undo/Redo操作后,會產生一個UndoRedoPerformed消息,如果我們用的不是直接操作Object的架構,則應該在收到UndoRedoPerformed消息后立刻根據object更新ui,如下:
Event e = Event.current;
?if (e.commandName == "UndoRedoPerformed") {//ref: http://answers.unity3d.com/questions/33065/repaint-on-undo.html
????Debug.Log ("undo performed");
????Object.buildUI(ui);
???}
總結
以上是生活随笔為你收集整理的unity, undo的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 语法分析-C语言程序
- 下一篇: 【C语言】第二章 类型、运算符和表达式