Strip Engine Code が 有効な場合 Unity は IL2CPP ビルド時に不要なコードを削除してくれます
対象となるのは
となっており、アセンブリファイルを入れたけど使わない場合や UnityEngine.Trrain など 使わないコードを削除してくれることでビルドサイズが抑えられます
設定箇所
PlayerSettings / Player / Other Setting で確認でき
Scripting Backend が IL2CPP の場合にのみ表示されます
問題点
ビルド時に含まれるコードというのは、アプリビルドに含まれるコードなので
アセットバンドルに含まれるコードは対象外とまります
そのため、アセットバンドルには含めているがビルド内のコードからは
アクセスされていないコードは削除されてしまいます
例えば SortingGroup は Order in Layer を変えるだけのもので、
ビルド時のスクリプトから参照しなければ、アセットバンドルには含まれているが、
ビルド時に含まれないといったことが起きます
しかも、実機でしか発生しないのでちゃんとログを追えないとなぜ動作しないのか意味がわからなくなります
エラーは以下のようなもので、これだけ見てもここと紐付けるのも難しい・・・
Could not produce class with ID {*****}.
対応方法
IL2CPP を使ったマネージバイトコードストリップ - Unity マニュアル
公式のドキュメントにも記述されていますが link.xml
を作成することで
このファイルに記述したコードを削除対象外とすることができます
<linker> <assembly fullname="UnityEngine"> <type fullname="UnityEngine.Terrain" preserve="all"/> </assembly> <assembly fullname="UnityEngine.Rendering"> <type fullname="UnityEngine.Rendering.SortingGroup" preserve="all"/> </assembly> </linker>
これでアセットバンドルにしか含まれないコードでも、エラーを起こさずに動作させることができます