如果在操作一个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. Windows 配置 Apache Python CGI

    提示:安装Apache可参考 https://jingyan.baidu.com/article/0eb457e53c019f03f1a905c7.html 1.  打开URL: https://ww ...

  2. 【java】弃用System.out.println(),迎接log

    展示性能差异: 1.System.out.println()输出 package com.sxd.swapping.test; import org.junit.Test; public class ...

  3. 宿主机訪问virtualBox中Ubuntu

    斌斌 (给我写信) 原创博文(http://blog.csdn.net/binbinxyz).转载请注明出处! 使用NAT模式.就是让虚拟系统借助NAT(网络地址转换)功能.不须要你进行不论什么其它的 ...

  4. iOS网络编程解析协议三:JSON数据传输解析

    作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 基于JavaScript的一个子集 易读性略差,编码手写难度大,数据量小 JSON格式取代了XML给网络传输带来了很大的便利, ...

  5. GPGPU OpenCL使用结构体数据

    OpenCL编程中可以使用结构体,只需要在核函数kernel中提供同样的结构体申明就可以啦. 如果在主函数中定义了结构体: typedef struct studentNode{ int age; f ...

  6. django基础复习

    Django - 路由系统 url.py - 视图函数 views.py - 数据库操作 models.py - 模板引擎渲染 - HttpReponse(字符串) - render(request, ...

  7. ExtJS ComboBox 录入智能提示

    ExtJS ComboBox非常复杂,有很多的属性:其中有的属性是针对某一种特定的方案而设计的,不是所有情况下都有效.我想下拉选择能支持录入,并且录入时能智能提示,弄了半天可以了,但是只能是mode= ...

  8. OpenStack 部署总结之:单节点icehouse网桥的配置

    部署完icehouse,安装完实例之后.假设虚拟主机须要和外部进行通信.还须要对宿主机的网桥进行配置 宿主机的配置 改动ifcfg-em1的内容为下面内容: DEVICE=em1 ONBOOT=yes ...

  9. 使用Nodejs的Nodemailer通过163信箱发送邮件例程

    首先需要安装一下nodemailer #nmp nodemailer install --save 然后就参照官方文档的例程改写一下就行了,代码如下: 'use strict'; const node ...

  10. (笔试题)N!的三进制数尾部0的个数

    题目: 用十进制计算30!(30的阶乘),将结果转换成3进制进行表示的话,该进制下的结果末尾会有____个0. 思路: 这道题与上一篇博文N!尾部连续0的个数的思路是一样的. 计算N!下三进制结果末尾 ...