unity, undo
如果在操作一個(gè)Object之前調(diào)用Undo.RecordObject(Object),且操作確實(shí)造成Object某些屬性的改變,則會(huì)產(chǎn)生一個(gè)undo記錄。
如果我們的架構(gòu)不是直接操作Object,而是操作一個(gè)ui,并在某些時(shí)機(jī)通過(guò)ui.save(Object)將數(shù)據(jù)回寫到Object,那么:
1,如果我們每幀都ui.save(Object)的話,則Object始終保持同步更新,與直接操作Object是等價(jià)的,所以只要在對(duì)ui操作之前調(diào)用Undo.RecordObject(Object),那么只要操作確實(shí)造成ui某些屬性改變(并且這個(gè)屬性是要回寫到Object的,進(jìn)而導(dǎo)致Object相應(yīng)屬性的變化),則會(huì)產(chǎn)生一個(gè)undo記錄。
2,如果我們嫌每幀都調(diào)ui.save(Object)太耗,改成每隔一段較長(zhǎng)的時(shí)間才save一次的話,則Object相對(duì)于ui的更新是滯后的,那么在對(duì)ui進(jìn)行操作之前調(diào)用Undo.RecordObject(Object),但要注意,在這之前應(yīng)該先調(diào)用一下ui.save(Object),以便保證Record下來(lái)的快照是最新的數(shù)據(jù),然后在執(zhí)行ui的操作代碼,接著,我們應(yīng)該再調(diào)用一次ui.save(Object),原因是,我們要在保證在這幀結(jié)束之前讓Object的狀態(tài)變?yōu)椴僮髦蟮淖钚聽(tīng)顟B(tài),這樣,在幀末unity就會(huì)自動(dòng)對(duì)我們Record下來(lái)的快照和Object操作之后的最新?tīng)顟B(tài)進(jìn)行對(duì)比,如果存在差異,產(chǎn)生一條undo記錄。即:
ui.save(Object);//Object變成修改前的最新?tīng)顟B(tài)
Undo.RecordObject(Object);//記錄Object修改前的最終狀態(tài)(狀態(tài)A)
ui.modify();//對(duì)ui進(jìn)行修改
ui.save(Object);//Object變成修改后的最新?tīng)顟B(tài)(狀態(tài)B)
//unity 對(duì) 狀態(tài)A 和 狀態(tài)B 進(jìn)行對(duì)比,產(chǎn)生undo記錄
總結(jié):
如果每幀ui.save(Object)對(duì)性能影響不是很大的話,還是每幀save比較簡(jiǎn)單。
注:通常情況下,ui.save(Object)并不是非常耗費(fèi),所以可以每幀執(zhí)行。但反過(guò)來(lái)由數(shù)據(jù)重建ui(即Object.buildUI(ui))是比較耗費(fèi)的,所以O(shè)bject.buildUI(ui)應(yīng)只在個(gè)別時(shí)機(jī)才調(diào)用。
----補(bǔ)充:
當(dāng)執(zhí)行undo/Redo操作后,會(huì)產(chǎn)生一個(gè)UndoRedoPerformed消息,如果我們用的不是直接操作Object的架構(gòu),則應(yīng)該在收到UndoRedoPerformed消息后立刻根據(jù)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);
???}
總結(jié)
以上是生活随笔為你收集整理的unity, undo的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 语法分析-C语言程序
- 下一篇: 【C语言】第二章 类型、运算符和表达式