【Unity】「MissingMethodException」bytecode strippingを回避する

DEVELOP, Unity

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はメソッド単位でも指定できます。大抵の場合はクラスごと指定するのが楽だとは思います。

必要に応じて、どちらか好きな方を選択すると良いと思います。