【Unity】「MissingMethodException」bytecode strippingを回避する
UnityでリフレクションやLuaによる外部からアクセスする形でクラスを利用していると、il2cppビルド時にbytecode strippingによる最適化が効いて未参照クラスがビルドに含まれません。その結果、実行時に参照しようとしてエラーが出ます(MissingMethodException)。これには特定のクラスやライブラリだけ除外する方法があります。
IL2CPP を使ったマネージバイトコードストリップ – Unity マニュアル
目次
link.xml を使用する方法
例えばUnityEngineのMathfを最適化から除外したい場合、まずはAssets以下にlink.xmlファイルを作成します。そして
<linker>
<assembly fullname="UnityEngine">
<type fullname="UnityEngine.Mathf" preserve="all"/>
</assembly>
</linker>
この様に書きます。これでUnityEngine.Mathf クラスの関数群が全てアプリに内包される様になります。UnityEngineのコードをストリップしたくない場合はこれで対応すると良いでしょう。
PreserveAttribute を使用する方法
一方、自作の特定のクラスをストリップの対象外としたい場合は、PreserveAttributeを使用します。
Unity – Scripting API: PreserveAttribute
using UnityEngine.Scripting;
[Preserve]
class UsedByReflection
{
}
PreserveAttributeはメソッド単位でも指定できます。大抵の場合はクラスごと指定するのが楽だとは思います。
必要に応じて、どちらか好きな方を選択すると良いと思います。