LoginSignup
1
3

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-11-05

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

  • タイムラインアセットをビルドインに含めていない
  • 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();
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3