うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】Strip Engine Code

Strip Engine Code が 有効な場合 Unity は IL2CPP ビルド時に不要なコードを削除してくれます

対象となるのは

となっており、アセンブリファイルを入れたけど使わない場合や UnityEngine.Trrain など 使わないコードを削除してくれることでビルドサイズが抑えられます

設定箇所

PlayerSettings / Player / Other Setting で確認でき

Scripting Backend が IL2CPP の場合にのみ表示されます

f:id:hacchi_man:20200408223942p:plain

f:id:hacchi_man:20200408223610p:plain

問題点

ビルド時に含まれるコードというのは、アプリビルドに含まれるコードなので
アセットバンドルに含まれるコードは対象外とまります

そのため、アセットバンドルには含めているがビルド内のコードからは
アクセスされていないコードは削除されてしまいます

例えば 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>

これでアセットバンドルにしか含まれないコードでも、エラーを起こさずに動作させることができます