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