unity, undo
2016-01-13 14:35
971 查看
如果在操作一个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);
}
如果我们的架构不是直接操作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中LoadLevel与LoadLevelAsync的区别
- unity3d 音频无缝循环
- Unity中使用ulua的个人经验总结
- 微软IOC容器Unity简单代码示例1
- 微软IOC容器Unity简单代码示例2-配置文件方式
- Unity3D OnBecameVisible OnBecameInVisible 无效 没有用
- unity对于网址编码和解码EscapeURL和UnEscapeURL
- Unity3D-深入剖析NGUI的游戏UI架构
- unity 在菜单中添加 复制文件菜单项(简易版)
- Unity中数据库建立与读写详情
- Unity 前端开发积累 第二篇
- Unity3D角色换装及换装编辑器
- Unity3D 异步读取CSV文件
- 利用Microsoft.Practices.Unity的拦截技术,实现.NET中的AOP
- Unity3D游戏开发之如何发布Android游戏
- Unity3D游戏开发软件破解版安装
- Unity3D游戏开发软件破解版安装
- Unity3D游戏开发之如何发布Android游戏
- Unity3D中js与C#之间相互调用的解决办法
- 1.unity3d中的坐标系