unity, undo
如果在操作一个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);
}
unity, undo的更多相关文章
- Unity编辑器 - Undo的坑
Unity编辑器 - Undo的坑 编辑器通过脚本中改变值,Undo.RecordObject可能会无效,应该使用: Undo.RegisterCompleteObjectUndo(Object ob ...
- unity导出工程导入到iOS原生工程中详细步骤
一直想抽空整理一下unity原生工程导入iOS原生工程中的详细步骤.做iOS+vuforia+unity开发这么长时间了.从最初的小小白到现在的小白.中间趟过了好多的坑.也有一些的小小收货.做一个喜欢 ...
- [转]Unity: make your lists functional with ReorderableList
原文地址:http://va.lent.in/unity-make-your-lists-functional-with-reorderablelist/ This article is reprod ...
- [译]如何在Unity编辑器中添加你自己的工具
在这篇教程中你会学习如何扩展你的Unity3D编辑器,以便在你的项目中更好的使用它.你将会学习如何绘制你自己的gizmo,用代码来实现创建和删除物体,创建编辑器窗口,使用组件,并且允许用户撤销他们所作 ...
- Unity 之 Redux 模式(第一篇)—— 人物移动
作者:软件猫 日期:2016年12月6日 转载请注明出处:http://www.cnblogs.com/softcat/p/6135195.html 在朋友的怂恿下,终于开始学 Unity 了,于是有 ...
- Xcode中如何集成Unity
项目中需要集成unity,摸索了大半周,碰到了很多坑,终于搞定. 我的方法是,通过unity导出一个空的iOS项目,然后再新建一个Xcode项目,针对配置页面一一对应.直到配置完全一样,然后倒入相关资 ...
- Unity编辑器扩展-Custom List, displaying data your way
本文转自http://catlikecoding.com/unity/tutorials/editor/custom-list/ Custom List, displaying data your w ...
- Unity 3D编辑器扩展介绍、教程(二) —— 创建窗口
Unity编辑器扩展教程(二) 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 Brief Introd ...
- Unity 3D编辑器扩展介绍、教程(一) —— 创建菜单项
Unity编辑器扩展教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 Brief Introduct ...
随机推荐
- React事件初探
作者:朱灵子 React 是一个 Facebook 和 Instagram 用来创建用户界面的 JavaScript 库.创造 React 是为了解决一个问题:构建随着时间数据不断变化的大规模应用程序 ...
- PhD Positions opening at University of Nevada, Reno (Wireless Networking / Cognitive Radio / Wireless Security)
PhD Positions opening at University of Nevada, RenoDept. of Computer Science and Engineering Researc ...
- easyui 后台页面,在Tab中的链接点击后添加一个新TAB的解决方法
1.示例1 新增一个按钮 添加点击事件 onclick="self.parent.addTab('百度','http://www.baidu.com','icon-add')" 如 ...
- MANIFEST.MF文件Class-Path:节点需要引入的jar太多解决方案
每行开头结尾都要有一个空格(半角的) 例子如下: Manifest-Version: 1.0 Class-Path: lib/mongo-java-driver-2.11.4.jar lib/guav ...
- 使用CSS3建立不可选的的文字
下面的例子展示了在HTML5中你如何使用CSS建立不可选的文字. <!DOCTYPE HTML> <html> <head> <title>Creati ...
- 改善你的jQuery的25个步骤
1. 从Google Code加载jQueryGoogle Code上已经托管了多种JavaScript类库,从Google Code上加载jQuery比直接从你的服务器加载更有优势.它节省了你服务器 ...
- linux shell的执行方式
./ ping.sh 这个意思 ,'./'的意思是在当前目录执行, ping.sh----------------------------------------------------------- ...
- IntelliJ IDEA 插件开发视频教程
IntelliJ IDEA 插件开发视频教程 学习了:http://wiki.jikexueyuan.com/project/intellij-idea-tutorial/plugins-develo ...
- 当Intellij IDEA 遇到 Mac
当Intellij IDEA 遇到 Mac alt+insert变为control+N
- [Firebase] 2. Firebase Event Handling
/** * Created by Answer1215 on 11/9/2014. */ var app = angular.module('app', ['firebase']); app.cons ...