タイムラインが正常に再生されなくなる現象が発生する条件
- タイムラインアセットをビルドインに含めていない
- AssetBundleをダウンロードしてタイムラインアセットを利用している
- IL2CPPでビルドしている
原因
タイムライン内部で使用しているクラスが、UnityEngine.Timelineモジュール外で呼び出されることがなく、
ビルド時に不要なコードと判定されコンパイルされなくなる。
そのため、タイムライン再生時にスクリプトがmissingになってしまう。
対策にあたって
公式ドキュメント
・ IL2CPP を使ったマネージバイトコードストリッピング
・ link.xml指定方法
link.xmlにタイムライン関連のクラスを記述してビルド時にストリップされないようにする。
以下の記事を参考にして、アセットから使用しているスクリプトを取得して自動でlink.xmlを作成するようにもともと設定していた。
しかし、タイムラインアセットで使用しているタイプは上記で紹介されているコードで取得できなかった。
手動でUnityEngine.Timelineをlink.xmlに追加してビルドして確認したところ正常に再生できた。
<assembly fullname="Unity.Timeline, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
手動で追加してしまうと、テラシュールブログ様が紹介しているlink.xml自動生成の方法を用いたときに、
消えてしまうので、コードをお借りしてアセンブリを丸々指定する処理を追加。
オリジナル
処理を追加したもの
サンプル
var generator = new LinkXmlGenerator();
// UnityEditor.Animations.AnimatorControllerを取得してしまうので、RuntimeAnimatorControllerに変更
generator.SetTypeConversion(typeof(UnityEditor.Animations.AnimatorController), typeof(RuntimeAnimatorController));
// AssetBundleNameを持つアセットを全て取得して、LinkXmlGeneratorに登録する。
foreach (var bundleName in AssetDatabase.GetAllAssetBundleNames()) {
var assetPaths = AssetDatabase.GetAssetPathsFromAssetBundle(bundleName);
generator.AddAssets(assetPaths);
}
// タイムライン関連を追加
Assembly asm = Assembly.Load("Unity.Timeline");
generator.AddAssembly(asm);
// link.xmlファイルを保存
generator.Save("Assets/link.xml");
AssetDatabase.Refresh();