实现效果

核心功能

  1. 支持选定模型(带Animator)在非运行模式下,播放/暂停/停止动作。
  2. 支持动作单帧前进,单帧回退(帧时间默认0.05f,可以代码设置)。
  3. 支持滚动条拖拽,将动作调整到指定时间。
  4. 支持调整播放速度。

其他功能

  1. 支持循环播放。
  2. 支持选中Animator下的任一动作。
  3. 编辑器关闭时,会删除中间产生的临时GameObject
  4. 选中Project中的Prefab,如果符合条件,将会自己创建一份Clone到Hierarchy中。

效果图

实现原理

整体思路

  1. 获取指定GameObject上的Animator,并记录其所有的AniamtionClip。
  2. 模拟播放时间,通过AnimationMode.SampleAnimationClip方法设置播放位置。
  3. 添加进度条,单帧执行等方式修改播放时间。

注意细节

  1. 如果模型勾选了OptimizeGameObject选项,优化骨骼,那么动作可能会因为找不到骨骼而无法播放。需要使用AnimatorUtility.DeoptimizeTransformHierarchy方法,暂时屏蔽骨骼优化。
  2. 在使用AnimationMode.SampleAnimationClip方法时,参数的GameObject应该设置为Animator所对应的GameObject而不是根节点。
  3. 因为不是运行状态,所以Update需要由EditorApplication.update提供。(工具关闭时,需要反注册)
  4. OnGUI方法不是每帧都执行,当使用滚动条( Slider )和进度条(ProgressBar)时,显示不会及时更新,所以当数据更新时,需要调用Repaint方法,强制刷新UI。
  5. EditorWindow下,OnSelectionChange方法可以用来监听选择变化。但是在这个方法内部,修改当前选中的对象(Selection的属性)无效。
  6. ProgressBar不能使用Layout,需要自己设置Position。在Layout中获取上一个Rect的位置,然后计算ProcessBar的位置,实现方式:
        if(Event.current.type == EventType.Repaint)
{
var lastRect = GUILayoutUtility.GetLastRect();
EditorGUI.ProgressBar(new Rect(lastRect.x, lastRect.y + lastRect.height, lastRect.width, 20), animationCtrl.escapeTime / animationCtrl.length, "");
}

存在疑问

  1. AnimationMode文档中说在使用 SampleAnimationClip时需要 StartAnimationMode,但没有调用,也是可以正常运行。BeginSampling,EndSampling作用什么?不加也可以正常运行。
  2. 在使用AnimatorUtility.OptimizeTransformHierarchy去还原模型时,需要知道exposedTransforms即需要保留的骨骼。但是没有找到获取exposedTransforms的方法,所以GameObject在被DeoptimizeTransformHierarchy之后无法还原。一种的思路是在调用DeoptimizeTransformHierarchy之前记录子Transform,并且去掉包含SkinnedMeshRender的Transform,使用这些Transform来当做exposedTransforms。但是这种方式不精确,对模型有限制。

ToDo

  1. 倒播。修改时间变化方式,添加符号判断。
  2. ParticleSystem.Simulate可以在非运行模式下制定特效播放到制定时间,可以用这个方法实现一套特效的播放回退机制。(特效比较复杂可能包含多个ParticleSystem,也可能包含动画)
  3. 结合动作和特效,实现特效与模型动作的匹配,指定特效延时时间,并且可以同时处理多个特效。(类似技能编辑器的表现)

源码下载

转载请注明出处:http://www.cnblogs.com/chiguozi/p/6862571.html

Unity非运行模式下实现动画播放/回退工具的更多相关文章

  1. 非GUI模式下运行JMeter和远程启动JMeter

    JMeter是一款非常不错的免费开源压力测试工具,越来越多的公司在使用.不过,在使用过程中可能会存在一些问题,比如:GUI模式非常消耗资源,单个客户端测试无法达到目标压力.而使用非 GUI 模式,即命 ...

  2. 测试Oracle 11gr2 RAC 非归档模式下,offline drop数据文件后的数据库的停止与启动测试全过程

    测试Oracle 11gr2 RAC 非归档模式下,offline drop数据文件后的数据库的停止与启动测试全过程 最近系统出现问题,由于数据库产生的日志量太大无法开启归档模式,导致offline的 ...

  3. 非归档模式下使用Rman进行备份和恢复

    实验环境: 一.首先进行全库数据备份: 在非归档模式下,rman备份需要在mount模式下进行 SQL> select status from v$instance; STATUS ------ ...

  4. socket异步通信-如何设置成非阻塞模式、非阻塞模式下判断connect成功(失败)、判断recv/recvfrom成功(失败)、判断send/sendto

    socket异步通信-如何设置成非阻塞模式.非阻塞模式下判断connect成功(失败).判断recv/recvfrom成功(失败).判断send/sendto 博客分类: Linux Socket s ...

  5. Oracle非归档模式下脱机数据文件

    正常情况下,要想对数据文件脱机,必须在归档模式下,这是ORACLE自动保护的一种措施,防止在非归档模式下对数据文件脱机,造成数据丢失.如果想在非归档模式下执行数据文件脱机操作,则需要加上“for dr ...

  6. 非IMU模式下DML语句产生的REDO日志内容格式解读

    实验内容:非IMU模式下DML语句产生的REDO日志内容格式解读 最详细的解读是UPDATE的. 实验环境准备 11G中默认是开启IMU特性的,做此实验需要关闭此特性. alter system se ...

  7. 使用alter database datafile 'XXX' offline drop 是否能够恢复(非归档模式下)

    今天在群里面听到一位网友在说使用了alter database datafile 'XXX' offline drop命令是否能够恢复数据,在非归档模式下,下面是用一个实验来验证一下 ######## ...

  8. oracle非归档模式下的冷备份和恢复

    查看归档的相关信息 SQL> archive log list数据库日志模式             非存档模式自动存档             禁用存档终点            USE_DB ...

  9. IE兼容模式与非兼容模式下jq的写法

    1.  $("#LabelRepeatType").removeAttr("disabled");                $("#LabelF ...

随机推荐

  1. 简单的叙述下SQL中行列转换的小知识!

    行列转换对于工作还是学习中总是不可避免的会遇到(虽然本人还尚未工作,萌萌哒的学生一枚),解决的方法也有很多,我这里就总结一下我所想解决的问题以及怎么去解决的方法, 可能网上已经有很多类似的方法了,有的 ...

  2. Cobbler自动化部署最佳实践

    第1章 Cobbler自动化部署最佳实践 运维自动化在生产环境中占据着举足轻重的地位,尤其是面对几百台,几千台甚至几万台的服务器时,仅仅是安装操作系统,如果不通过自动化来完成,根本是不可想象的. 面对 ...

  3. SSH程序框架的整合(1)

    spring整合hibernate 有两种方式 1.注解方式 2.xml方式实现 Spring整合Hibernate有什么好处? 1.由IOC容器来管理Hibernate的SessionFactory ...

  4. 老李推荐:第8章7节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-小结

    老李推荐:第8章7节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-小结   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...

  5. 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用

    老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用   上一节我们描述了monkey的命令处理入口函数run是如何调用optionP ...

  6. Canvas绘制一个大鱼喂小鱼的游戏

    Canvas是HTML5中的一部分,强大的API足以让我们绘制我们任意想绘制的东西.利用Canvas的基础学习以及JavaScript面向对象的思想绘制一个小游戏,下面是源码地址https://git ...

  7. apache的配置参数

    #ErrorDocument 500 "The server made a boo boo."#ErrorDocument 404 /missing.html 1.Document ...

  8. 【G】开源的分布式部署解决方案文档 - 部署Console & 控制负载均衡 & 跳转持续集成控制台

    G.系列导航 [G]开源的分布式部署解决方案 - 导航 设置项目部署流程 项目类型:选择Console,这个跟功能无关,只是做项目分类,后面会有后续功能 宿主:选择Console 部署方式:选择原始, ...

  9. CTR预估中的贝叶斯平滑方法(二)参数估计和代码实现

    1. 前言 前面博客介绍了CTR预估中的贝叶斯平滑方法的原理http://www.cnblogs.com/bentuwuying/p/6389222.html. 这篇博客主要是介绍如何对贝叶斯平滑的参 ...

  10. 使用上传插件 Web Uploader 上传图片到七牛云(C#)

    之前有写过一篇文章,基于asp.net mvc 封装 Web Uploader 上传插件: http://www.cnblogs.com/vanteking/p/5623682.html 已经实现的功 ...