本文地址:https://blog.csdn.net/t163361/article/details/95497417
最近在做Unity发布模式下录制相关的工作。本篇文章涉及的内容都已经实现并且在exe下跑通了,但是代码不方便提供,所以本文只提供一个思路,方便后来者。
想要完成发布版本中的录制和回放,主要涉及以下几个部分
1.录制功能 – 自己实现
2.存储格式 – glTF
3.回放 – legacy类型的AnimationClip,同时实现支持Animation的TimelineTrack
下面讲为什么采用以上方案
录制
Unity本身提供一个GameObjectRecorder组件来支持编辑器模式下的录制,但是当发布到EXE的时候就无法使用了。只能自己实现。
录制功能由其他同事做了,原理就是每帧去记录顶点的位置,同时通过一个录制属性,添加到自己想要的成员变量上,录制前先绑定,做预处理,然后每一帧,记录相关数据。
存储
之前的录制支持保存成YAML和AnimationClip.都不是很完善,一个体积大,一个只支持Unity同时也只能在编辑器模式下用。
通过对比,决定选用glTF作为保存格式,这个格式有很多优点
1.开源,方便自己修改
2.标准制定组织是OPENGL的标准制定组织,权威
3.支持二进制模式,节省存储体积
4.本身就支持很多通用类型,比如模型,动作,摄像机,灯光等
5.支持扩展
FBX也支持,但是代码是闭源的,放弃了。
缺点,貌似没有直接支持的编辑器,很多编辑器都支持导出,但是3dMax和Maya貌似不支持导入。如果有知道方法的请留言告知一下。
导入和导出主要修改的下面这个库
https://github.com/sketchfab/UnityGLTF
这是一个模型分享网站制作的工具,支持Editor模式下的导入和导出功能
导出时,动作的处理模块主要在convertClipToGLTFAnimation这个函数里面处理。如果想要运行时使用,需要完成自己的录制功能,然后把自己的录制数据结构导入,进行转换,它默认支持的是AnimationClip。
回放
回放涉及到导入和播放两部分,主要因为导入的限制,决定了播放只能使用Animation
导入时,有个比较坑的地方,AnimationClip分两种类型,一种是legacy类型的,支持在Aniamtion组件上使用,是一种老的格式。非legacy是在Animator组件上用的。导入时的SetCurve函数,只能生成legacy类型的AnimationClip,所以只能使用这种类型的,结果就导致没办法直接用到Timeline的AnimationTrack上。
编辑器模式下两种格式很容易转换,AnimationClip.legacy=true/false;Unity就可以帮你转换,但是运行时模式下是不生效的。所以legacy类型的Clip想要在Timeline上用,需要自己写支持Animation的Track来支持。
官方也有个Unity的插件,但是目前(2019年4月)的进度对Animation支持的不好,并且也都是基于编辑器的,所以还是需要自己写很多。也许未来就支持了~可以自己去看看当前的支持力度。
https://github.com/KhronosGroup/UnityGLTF
注意点:
AnimationCurve.keys每次调用都会触发GC的内存分配,需要自己优化,不然GC会非常高。