如果在操作一个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的更多相关文章

  1. Unity编辑器 - Undo的坑

    Unity编辑器 - Undo的坑 编辑器通过脚本中改变值,Undo.RecordObject可能会无效,应该使用: Undo.RegisterCompleteObjectUndo(Object ob ...

  2. unity导出工程导入到iOS原生工程中详细步骤

    一直想抽空整理一下unity原生工程导入iOS原生工程中的详细步骤.做iOS+vuforia+unity开发这么长时间了.从最初的小小白到现在的小白.中间趟过了好多的坑.也有一些的小小收货.做一个喜欢 ...

  3. [转]Unity: make your lists functional with ReorderableList

    原文地址:http://va.lent.in/unity-make-your-lists-functional-with-reorderablelist/ This article is reprod ...

  4. [译]如何在Unity编辑器中添加你自己的工具

    在这篇教程中你会学习如何扩展你的Unity3D编辑器,以便在你的项目中更好的使用它.你将会学习如何绘制你自己的gizmo,用代码来实现创建和删除物体,创建编辑器窗口,使用组件,并且允许用户撤销他们所作 ...

  5. Unity 之 Redux 模式(第一篇)—— 人物移动

    作者:软件猫 日期:2016年12月6日 转载请注明出处:http://www.cnblogs.com/softcat/p/6135195.html 在朋友的怂恿下,终于开始学 Unity 了,于是有 ...

  6. Xcode中如何集成Unity

    项目中需要集成unity,摸索了大半周,碰到了很多坑,终于搞定. 我的方法是,通过unity导出一个空的iOS项目,然后再新建一个Xcode项目,针对配置页面一一对应.直到配置完全一样,然后倒入相关资 ...

  7. Unity编辑器扩展-Custom List, displaying data your way

    本文转自http://catlikecoding.com/unity/tutorials/editor/custom-list/ Custom List, displaying data your w ...

  8. Unity 3D编辑器扩展介绍、教程(二) —— 创建窗口

    Unity编辑器扩展教程(二) 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 Brief Introd ...

  9. Unity 3D编辑器扩展介绍、教程(一) —— 创建菜单项

    Unity编辑器扩展教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 Brief Introduct ...

随机推荐

  1. 【docker】docker network常用命令参数

    1.帮助命令 docker network --help 2.查看docker默认三种网络 docker network ls 3.创建自定义网络,如果不指定,默认创建类型为bridge类型 dock ...

  2. 前端必备工具-Emmet (Zen Coding)

    Emmet 可以快速的编写 HTML 和 CSS,输入指令如: ul#nav>li*4>a*4 敲击一下TAB 键,就会输出: <ul id="nav"> ...

  3. Unity3D开发之查找面板上某个脚本(包含Missing)

    有时候我们须要知道某个脚本在场景上面哪里用到,或者那个脚本被删除了但又没有把相关游戏场景的关联东西删掉,那样我们就要一个脚本来查找一下了: PS:以下两个脚本都要放到assets/Editor以下哦. ...

  4. 嵌入式linux内核和根目录制作

    系统组成:Bootloader, Boot parameters, Kernel, Root filesystem嵌入式linux系统有linux内核与根文件系统两部分构成,两者缺一不可. 内核制作: ...

  5. jQuery -&gt; filter使用方法

    利用filter函数能够从wrapper set中过滤符合条件的DOM元素. 假设我们有一个内容例如以下的html文件,要获取类为external的<a>元素,使用filter能够非常ea ...

  6. 美国保健品品牌介绍之Now Foods

    Now Foods是美国著名的美国保健品品牌,定位于大众品牌. 美国Now Foods公司位于美国伊利诺州,台湾中文名叫健而婷,成立于1968年,是美国保健品市场上名列三甲的国际知名的天然保健品牌,其 ...

  7. ShellCode的编写入门

    上次学习了下堆喷漏洞的原理,虽说之前有学习过缓冲区溢出的原理,但还没了解过堆喷这个概念,于是趁此机会学习了,顺便复习了缓冲区溢出这块知识,之前由于各种原因对Shellcode的编写只是了解个大概,并没 ...

  8. go语言基础之defer延迟调用

    1.defer作用 关键字 defer ⽤于延迟一个函数或者方法(或者当前所创建的匿名函数)的执行.注意,defer语句只能出现在函数或方法的内部. 运行场景: defer语句经常被用于处理成对的操作 ...

  9. 小议使用“完整”的CSS的缺点

    1.浏览器支持的不一致性 浏览器的漏洞或缺乏支持的CSS功能,导致不同的浏览器显示出不同的CSS版面编排.例如在微软Internet Explorer6.0的旧版本 ,执行了许多自己的CSS2.0属性 ...

  10. 转:如何转换Android打包用jks格式keystore证书为Air用pkcs12格式p12证书

    转自:http://blog.k-res.net/archives/1539.html 如何转换Android打包用jks格式keystore证书为Air用pkcs12格式p12证书 六月 11, 2 ...