渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

ネイティブプラグインショートコード


f:id:esakun:20150730215258g:plain

ネイティブプラグインのショートコードを書いてみます。
(なんだかんだで私が書いたことがなかったため)

今回は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側の何かを呼んでみようと思います。

今回のサンプルコードはコチラ

参考