Unity 运行时(发布模式)录制回放解决思路

本文地址: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会非常高。

猜你喜欢

转载自blog.csdn.net/t163361/article/details/95497417