如果在操作一个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. NUMA架构

    参考: http://www.ibm.com/developerworks/cn/linux/l-numa/ http://blog.sina.com.cn/s/blog_3f5c2f8c01000b ...

  2. 【spring cloud】一个ms微服务想要给注册中心eureka发现,需要满足这些条件,微服务不能被eureka注册中心发现的解决方案

    在spring cloud中,一个新的微服务想要被注册中心发现,需要注意几个地方: 1.pom.xml文件依赖中需要有这个依赖 spring boot 2.x 需要这个依赖 <dependenc ...

  3. 简单Gif制作

    没什么需求,只是循环图片的推荐:http://gif.55.la/ ,在线制作,无需下载

  4. AIR:使用 HTML + Javascript 开发桌面应用

    背景 断断续续用Winform和WPF开发过一些小工具,始终不得其法门,在玩Flex的时候就接触过AIR,最近发现可以用HTML + Javascript开发AIR应用,本文就尝试一下(Hello,W ...

  5. Linux进程间通信—消息队列

    四.消息队列(Message Queue) 消息队列就是消息的一个链表,它允许一个或者多个进程向它写消息,一个或多个进程向它读消息.Linux维护了一个消息队列向量表:msgque,来表示系统中所有的 ...

  6. 查找链表中倒数第k个结点

    题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针.链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNex ...

  7. DICOMDIR结构

    DICOMDIR文件结构: 格式: DICOMDIR文件遵照DICOM文件的存储格式,需要有128个无意义字节的前言(假如没有特殊要求,这些字节都为00H),紧接着是DICOM前缀(长度为4字节的“D ...

  8. UTC 转本地时间

    String dateStr = "Wed Dec 10 00:00:00 UTC 0800 2014"; //Wed Dec 10 00:00:00 UTC 0800 2014 ...

  9. Qt Creator的安装与Qt交叉编译的配置

    Qt Creator 的安装 到Qt官网下载Qt Creator  https://www.qt.io/download-open-source/ 其它旧版本点击Achieve连接下载 或登录http ...

  10. java开发struts2项目遇到FilterDispatcher过时

    由于工作需要,再次需要写一些简单的Java代码了,曾经的Java编程历历在目,但是却再也找不到以前的感觉了.于是便怀着对儿时Java的记忆,再次踏上Java Web Project. 在此特别鸣谢:h ...