3
Help us understand the problem. What are the problem?

posted at

updated at

Organization

UnityTimeline関連のコードがストリップされ、正常に再生されなくなる現象

タイムラインが正常に再生されなくなる現象が発生する条件

  • タイムラインアセットをビルドインに含めていない
  • AssetBundleをダウンロードしてタイムラインアセットを利用している
  • IL2CPPでビルドしている

原因

タイムライン内部で使用しているクラスが、UnityEngine.Timelineモジュール外で呼び出されることがなく、
ビルド時に不要なコードと判定されコンパイルされなくなる。
そのため、タイムライン再生時にスクリプトがmissingになってしまう。

対策にあたって

公式ドキュメント
IL2CPP を使ったマネージバイトコードストリッピング
link.xml指定方法

link.xmlにタイムライン関連のクラスを記述してビルド時にストリップされないようにする。

以下の記事を参考にして、アセットから使用しているスクリプトを取得して自動でlink.xmlを作成するようにもともと設定していた。

テラシュールブログ様
【Unity】AssetBundleが使用しているアセット一覧を渡して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();
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
3
Help us understand the problem. What are the problem?