ネイティブプラグインのショートコードを書いてみます。
今回はC++で書いたiOSのネイティブプラグインを想定します。
プラグインファイル側のお作法
Plugins/iOS/
配下に格納する- .cppの拡張子にする
extern "C"{ }
でソースを囲む
※Pluginsフォルダ
はルート階層に無くても大丈夫です。
(例 : SamplePlugin.cpp)
extern "C" { float _fooPluginFunction () { return 5.0F; } }
C#側
[DllImport("__Internal")]
を記述static extern "戻り型" "プラグインの関数名()"
を定義
(例 : UsePlugin.cs)
public class UsePlugin : MonoBehaviour { [DllImport("__Internal")] static extern float _fooPluginFunction(); void Start () { _fooPluginFunction(); } }
これだけでネイティブプラグイン実装は完了ですが、動作は実機でビルドしないと出来ません。
動作しているのかしていないのかは、ログをしっかり出してXcodeのコンソールを見ながら動作確認するというのがフローだと思います。
ここまではC#からC++を実行していましたが、C++からC#も呼ぶことが可能です。
プラグインファイル側のお作法
- UnitySendMessage関数を使う
- 第1引数:呼びたい関数を保持したコンポーネントがアタッチしているGameObject名
- 第2引数:呼びたい関数名を文字列で記述
- 第3引数:C#へ渡す文字列(省略できない)
(例 : SamplePlugin.cpp)
extern "C" { float _fooPluginFunction () { // C#に定義したFromNativeCallという関数を呼ぶ UnitySendMessage("Go", "FromNativeCall", "Native to C#"); return 5.0F; } }
C#側
- 呼ばれる関数をpublicなインスタンス関数として定義
- 文字列引数付きの関数にする
(例 : UsePlugin.cs抜粋)
public void FromNativeCall (string param) { Debug.Log("FromNativeCall: " + param); }
実装自体は結構簡単そうですが、テストは実機ビルドしないと出来ないという面倒臭さがあります。またネイティブプラグイン側でメモリーリークする可能性も出てくるため、プロファイラーをしっかり見ながら辛抱強く実装する必要がありそうです。
次回iOS側の何かを呼んでみようと思います。
今回のサンプルコードはコチラ
参考