Windows プレイヤー用のプロジェクトをビルドする場合に、スクリプティングバックエンドとして Mono の代わりに IL2CPP を使用できます。
IL2CPP を使用してプロジェクトをビルドする場合、Unity はネイティブのバイナリを作成する前に、IL コードをスクリプトやアセンブリから C++ に変換します。詳細は IL2CPP を参照してください。
IL2CPP スクリプティングバックエンドを使用するときに、C++ (.cpp) コードファイルを Unity プロジェクトに直接加えることができます。これらの C++ ファイルは Plugin インスペクター内でプラグインとして機能します。Windows Player と互換性を持つように C++ ファイルを設定すると、Unity はマネージアセンブリから生成された C++ コードと共にそれらをコンパイルします。
C++ ファイルのプラグインインポーター設定を表示するには、.cpp ファイルをクリックし、Inspector のプラットフォーム設定セクションで適切な Windows オプションを選択します。
関数は生成された C++ コードでまとめてリンクされているため、_P/Invoke
への別の DLL はありません。このため、DLL 名の代わりに "__Internal"
キーワードを使用します。これにより、関数をランタイムにロードするのではなく、関数を解決するのは C++ リンカーの役割となります。以下はその例です。
[DllImport("__Internal")]
private static extern int
CountLettersInString([MarshalAs(UnmanagedType.LPWStr)]string str);
このような関数を NativeFunctions.cpp
で以下のように定義することができます。
extern "C" **declspec(dllexport) int **stdcall CountLettersInString(wchar_t* str)
{
int length = 0;
while (*str++ != L'\0')
length++;
return length;
}
リンカーが関数呼び出しを解決するため、マネージ側の関数宣言 (マネージランタイムで実行される C# コード) で発生するエラーは、ランタイムエラーではなくリンカーエラーになります。これはまた、ランタイムに動的な読み込みを行う必要がないことを意味し、関数は C# から直接呼び出されます。これにより、P/Invoke
呼び出しのパフォーマンスオーバーヘッドが著しく減少します。
Unity は、生成された C++ コードと同じ C++ コンパイラー引数を使用してソース コードプラグインをコンパイルしますが、これは変更できません。プラグインソースコードの一部で C++ コンパイラー引数を制御する必要がある場合は、代わりにネイティブのプラグインをビルドする必要があります。詳細については、ネイティブ プラグイン を参照してください。
IL2CPP スクリプティングバックエンドを使用するプロジェクトは、一般的に以下のファイルを生成します。
以下のファイルは、IL2CPP を使用するプロジェクトに共通です。
ファイル | 説明 |
---|---|
a_Data | ゲームデータを持つフォルダー |
a.exe | メインのゲーム実行ファイル |
UnityCrashHandler64.exe | クラッシュハンドラの実行ファイル |
UnityPlayer.dll | すべてのネイティブコードを含む Unity Player ライブラリ |
WinPixEventRuntime.dll | Windows ランタイムの PIX。このファイルは開発ビルドにのみ存在します。 |
a_BackUpThisFolder_ButDontShipItWithYourGame | ゲームのデバッグに必要なデータを格納するフォルダー。PDB (デバッグ情報) ファイルや、スクリプトから生成された C++ コードなどが含まれます。このフォルダーは、ビルドを出荷するたびにバックアップする必要がありますが、再配信しないでください。 |
GameAssembly.dll | IL2CPP ランタイムとすべてのスクリプトコードを含むライブラリ |
SymbolMap | すべてのマネージ関数のアドレスとその長さのリストを含むファイル。IL2CPP はマネージスタックトレースを解決するために、これを必要とします。これを削除しても、ゲームはまだ実行できますが、しかし、例外によって適切な呼び出しスタックが生成されるという保証はありません。 |