この記事でのバージョン
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と呼び出すメソッドの名前を手打ちしなくてよくなりました!
ただし、例だと送られてきた名前を即使っていますが、実際にはネイティブ側で名前を保持し、
適宜(なんらかの処理が終わった後とか)使う事になると思います。