事實證明,Undo.RecordObject 并不是所有撤消情況的靈丹妙藥。借助 RecordObject,可以準確還原物件的某些更改,但有時某些更改會導致撤消時損壞的物件。
這是一種補救這種情況的嘗試:
uj5u.com熱心網友回復:
原因
這是因為撤消會將更改組合在一起。當 Unity 嘗試組合陣列操作時,似乎只保留了最舊的修改。似乎Unity 折疊了所有更改陣列大小的操作,因為它將它們視為相同型別的操作。
撤消操作會根據事件自動組合在一起。
目前可以確定MouseDown事件可以自動拆分這些撤消操作,但是MouseDrag不會。
復制
我們來看一個簡單的例子,Unity記錄的內容如下:
通過單擊添加 3 個元素 1、2、3。
size 0->1size 1->2size 2->3
通過從 3 拖動到 1 來洗掉它們。
size 3->2, array[2] 3->3size 2->1, array[1] 2->2size 1->0, array[0] 1->1
執行撤消操作。
這里由于第2步的操作是通過拖拽來進行的,所以它們是合并在一起的,Unity只保留最舊的尺寸修改
size 3->2, array[2] 3->3,動作就行size 2->3, array[2] 3->3了,最終得到的結果是[0, 0, 3]。順便說一句,如果您從 1 到 3 洗掉元素,則在第 2 步中,撤消將恢復為所需的結果。
size 3->2, array[0] 1->2, array[1] 2->3, array[2] 3->3size 2->1, array[0] 2->3, array[1] 3->3size 1->0, array[0] 3->3
解決方案
這里有一些方法可以避免這個問題。
不要在 MouseDrag 事件中記錄物件。
手動增加撤消組索引。
private void RemoveCell(ListObj obj, int index) { Undo.IncrementCurrentGroup(); Undo.RecordObject(obj, "remove cell"); obj.content.Remove(index); }使用 RegisterCompleteObjectUndo。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/440951.html
上一篇:將“分數”與計時器同步?(統一)
