(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

安心安全にUnitySendMessageを使う【Unity】【iOS】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 5.6.1f1
Xcode 8.3.2


はじめに

UnityではiOSのネイティヴコードからC#(またはjs)を実行するためのメソッド、UnitySendMessage

が用意されています。

Unity iOS は、“UnitySendMessage” を媒介に、限定的なネイティブからマネージコードへのコールバック( native-to-managed callback )をサポートしています


簡単に使えるUnitySendMessageですが、ターゲットになるGameObjectと呼び出すメソッドの名前

文字列で指定しないといけないという欠点もあります。

UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");


これだと打ち間違いの可能性がありますし、名前の変更に対応する事もできません。


と言う事で今回は、安心安全にUnitySendMessageを使おうという記事です。


安心安全にUnitySendMessageを使う

方法は至ってシンプルで、ターゲットになるGameObjectの名前と呼び出すメソッドの

名前をUnity側からネイティヴ側に送って、それを使ってUnitySendMessageを実行するだけです。


なお、メソッドの名前はActionにキャストし、Method.Nameを使う事で取得しています。




/*Unity側*/
private void Start () {
  //ネイティブのコードを実行(GameObjectと呼び出すメソッド名前も送る)
  _NativeMethod(gameObject.name, ((Action<string>)Callback).Method.Name);
}

[DllImport("__Internal")]
private static extern IntPtr _NativeMethod(string gameObjectName, string callbackMethodName);

//ネイティブ側から実行されるコールバック
private void Callback(string message){}
/*ネイティヴ側*/
void _NativeMethod(const char *gameObjectName, const char *callbackMethodName){
  //Unity側から送られてきたGameObjectと呼び出すメソッド名前を使ってUnitySendMessageを実行
  UnitySendMessage(gameObjectName, callbackMethodName, "Message");
}


これで、ターゲットになるGameObjectと呼び出すメソッドの名前を手打ちしなくてよくなりました!


ただし、例だと送られてきた名前を即使っていますが、実際にはネイティブ側で名前を保持し、

適宜(なんらかの処理が終わった後とか)使う事になると思います。