引言
自定义编辑器时,有些操作希望能够撤销。
比如,我们目前正在开发的spline编辑,拖动控制点、修改spline属性这两种操作是很难一次做到位的,那么就可能需要多次的undo。那么如何实现呢?
实现Undo/Redo通常有3种方式:
- 一、基于对象序列化的Undo\Redo
- 二、基于Command模式的Undo\Redo
- 三、结合RoutedEvent、Observer模式和Command模式的Undo\Redo
不过Unity已经向我们提供了一套Undo的API,无需自己实现。
Unity Undo原理
Unity中Undo使用的数据结构基于Stack,采用LIFO(Last In First Out)的策略,越晚进栈的越早被弹出。
Undo类让您可以针对要执行更改的特定对象注册撤销操作。撤销系统可以在撤销堆栈中存储增量更改。
系统会根据事件自动将多个撤销操作组合在一起,例如,根据鼠标按下事件拆分撤销组。分组后的撤销操作将作为单个撤销操作出现和使用。
撤销操作会存储每个属性或每个对象的状态。
最重要的几项操作如下所述:
-
修改单个属性
:Undo.RecordObject (myGameObject.transform, "Zero Transform Position")