BuildしたらAlembicがmissingになった時の対処法

Unity

unity2019.1.12でprefabからalembicStreamPlayer参照してる状況です。Editorで再生すると正常ですがBuildするとalembicが消えました。

https://forum.unity.com/threads/missing-alembic-streaming-assets.635320/

悲しいことに動的読み込みは想定されてませんでした

シーンに埋め込む

単純ですが、動的読み込みとは…ということになります。そもそもabcファイルデカすぎるから動的に読み込みにしたいのに…

とはいえ一応mp3とかみたくストレージからの動的読み込みならabcが丸々メモリにのることはなかろうということでdevelop buildでメモリ使用量測定してみました

結論からいうとまぁいいかなという感じ

Alembic無し
Alembic一個シーンにおいて、再生はしない
Alembic1個シーンにおいて、再生
Alembic6種類をシーンにおいて、一個だけ再生

Textureがなんで33→100Mになってるのか理解できないですが、全部で364MBのabcファイル参照したAlembicStreamPlayerを置いてもメモリ使用量は爆発しないです。

自前でabcファイルへのパスを書き換える

com.unity.formats.alembic/com.unity.formats.alembic/Editor/Importer/AlembicBuildPostProcess.cs at main · Unity-Technologies/com.unity.formats.alembic
Alembic importer and exporter plugin for Unity. Contribute to Unity-Technologies/com.unity.formats.alembic development by creating an account on GitHub.

これ参考にして書き換える系です。StreamDescriptor自体はScriptableObjectでPathToABCはただのstringなので書き換えればいいわけです。いいわけなんですがinternalでアクセスできないのでreflection使うとかになるっぽいです。

Getting time of clips on playing alembic tracks
Hi! We’re in the middle of a VR project that extensively uses alembic files of recorded actors. On these we add video textures synced to the alembic files....

一番下の方にalembic packageに自作のアクセサcomponentを追加することで割と手軽にinternalなalembic系にアクセスできるようになります。これの応用でなんとかprefabのPathToABCを書き換えてabc動的アクセス成功しました

 [MenuItem("Masak/Replace")]
    public static void Replace()
    {
        var go = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Resources/aaa.prefab");
        var ctr = go.GetComponentInChildren<AlembicStreamController>();// 自作クラス
        ctr.SetPathToABC("test.abc");
    }

コツはBuild直前に書き換えること。Build後もEditorで見れるにはどうすればいいかな…要検証です

abcを指定パスにコピー

最も単純です。Editor側でPathToABC=”Assets/test.abc”となっているならビルド後にできた{project}_Data/StreamingAssets/Assets/test.abcにコピーしてやるというものです。