Version: 2022.3
言語: 日本語
ネイティブプラグイン
低レベルのネイティブプラグインインターフェース

デスクトップ向けのプラグインのビルド

デスクトッププラットフォーム用のプラグインは、C、C++、Objective C で書かれたネイティブコードのライブラリです。ここでは、macOS、Windows、Linux のためのプラグインを説明します。詳細については、ネイティブプラグイン に関するドキュメントを参照してください。

macOS プラグイン

macOS プラグインはバンドルとして展開することができますが、IL2CPP スクリプティングバックエンド (ルーズ C++ ファイル) を使用する場合は、[DllImport("__Internal")] 構文で呼び出すことができます。緩い C++ プラグインの詳細については、macOS Player - IL2CPP のための C++ ソースコードプラグイン のドキュメントを参照してください。

Xcode でバンドルプロジェクトを作成するには、以下を行います。

  1. Xcode を開きます。
  2. File > New > Project > macOS > Framework & Library > Bundle の順に選択します。

Xcode での作業の詳細については、Apple の Xcodeに関するドキュメント を参照してください。

要件

  • プラグインは、64 ビットアーキテクチャと互換性のあるユニバーサルバイナリとしてビルドすることができます。あるいは、別の dylib ファイルを提供することもできます。
  • C++ (.cpp) または Objective-C (.mm) を使用してプラグインを実装する場合、名前マングリングを避けるために C リンケージで関数を宣言してください。
extern "C"
{
  float ExamplePluginFunction ();
}

Windows プラグイン

Windows のプラグインは、エクスポートされた関数を持つ .dll ファイル、または、IL2CPP を使用している場合は、ルーズ C++ ファイルです。.dll ファイルを作成できる大抵の言語や開発環境でプラグインを作成できます。名前マングリングの問題を避けるには、C リンケージを持つ C++ 関数を宣言する必要があります。

Linux プラグイン

Linux 上のプラグインは、エクスポートされた関数をもつ .soファイルです。これらのライブラリは、通常 C または C++ で書かれていますが、どの言語でも使用できます。他のプラットフォームと同様に、名前マングリングの問題を避けるために、C リンケージを持つ C++ 関数を宣言する必要があります。

Linux用ネイティブプラグインをビルドする際、ビルドされたライブラリが他のネイティブプラグインに依存関係がある場合、コンパイル時にそのライブラリの rpath を指定する必要があります。

リンカーフラグ -Wl, -rpath=$ORIGIN を加えて、実行時の検索パスを指定します。このリンカーフラグは、システムの検索パスを検索する以外に、ライブラリの現在のディレクトリで依存関係を検索するようにローダーに指示します。他のリンカーフラグを -Wl, -rpath=$ORIGIN と一緒に加えることもできますが、Unity はそれらを制御しません。例えば、/usr/bin/g++ -o binary.c.o -Wl,-rpath=$ORIGINのように使用します。

あるいは、LD_LIBRARY_PATH=dependency wo path を環境に設定することで、ローダーにそのパスで依存関係を検索するように指示することもできます。Linux では、現在のディレクトリから依存関係を自動的に検索することはありません。誤ったパスは、Unity エディターでライブラリが見つからないエラーを引き起こすため、依存関係の正しい検索パスを設定するようにしてください。

Unity 内のプラグインの管理

Unity では、Plugin Inspector がプラグインを管理します。Plugin Inspector にアクセスするには、Project ウィンドウ でプラグインファイルを選択します。スタンドアロンプラットフォームの場合は、ライブラリが対応している CPU アーキテクチャを選択します。クロスプラットフォームのプラグインの場合は、.bundle ファイル(macOS の場合)、.dll ファイル (Windows の場合)、.so ファイル (Linux の場合) を含む必要があります。Unity は、ターゲットプラットフォームに適したプラグインを自動的に選択し、プレイヤーに加えます。詳細については、Plugin Inspector を参照してください。

Plugin Inspector
Plugin Inspector

C# スクリプトからプラグインを呼び出す

ビルドしたプラグインを Assets フォルダーまたは Unity プロジェクトの適切なアーキテクチャ固有のサブディレクトリに配置します。C# スクリプトから呼び出すと、Unity は名前でそれを見つけます。例: [DllImport ("PluginName")] private static extern float ExamplePluginFunction ();

ノート: PluginName がライブラリのプレフィックスやファイル拡張子を含まないように注意してください。例えば、プラグインファイルの実際の名前は、PluginName.dll (Windows の場合) や libPluginName.so (Linux の場合) にします。

プラグインの例

これらのプロジェクトをダウンロードして使用することで、Unity でのプラグイン実装の方法を学ぶことができます。

  • Simplest Plugin Example: このプロジェクトは、基本的な操作 (例えば、数値の表示、文字列の表示、2 つの float の加算、2 つの int の加算) を実装します。このプロジェクトには、Windows、macOS、Linux のプロジェクトファイルが含まれています。
  • Native Renderer Plugin: これは低レベルのレンダリングプラグインで、通常のレンダリングがすべて行われた後に C++ コードから回転する三角形を描画し、Texture.GetNativeTexturePtr を使用して C++ コードにアクセスし、コードから手続き型テクスチャを塗りつぶします。このプロジェクトには、Windows、UWP、macOS、WebGL、Android のファイルが含まれています。
ネイティブプラグイン
低レベルのネイティブプラグインインターフェース