二学一做网站,软装设计师培训学校,舞美设计制作公司,wordpress电影源码如果在操作一个Object之前调用Undo.RecordObject(Object)#xff0c;且操作确实造成Object某些属性的改变#xff0c;则会产生一个undo记录。 如果我们的架构不是直接操作Object#xff0c;而是操作一个ui#xff0c;并在某些时机通过ui.save(Object)将数据回写到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); }