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會非常高。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章