先日、ネイティブプラグインを使用せずにObjective-Cのコードを呼び出す方法を教えてもらった。これを使用すると、AndroidObjectのようにObjective-Cのコードが取得できる。
やり方
まず以下のコードを用意する。
UnityのC#からNativePluginsを使わずObjective-C++を呼び出すテスト
これを導入すると、以下のコードのように、Objective-Cのコードを直接呼び出すことが可能となる。
以下のコードでは、Objective-Cで定義したクラスをC#側で生成・管理している。
現状は、「インスタンスが取得できる」もしくは「静的なメソッド」で「引数が無いもの」ならば概ね直接呼べるっぽい。
原理
さて、これの原理だが、どうやらObjective-Cは[Object Method:argument] と呼ぶ際、実際はobjc_msgSend(id, method, argument....) のコードを生成し実行しているらしい。要するに間接的な形でメソッドを実行する。
そのため、そのメソッドを登録し実行する処理*1自体をDllImportでC#から呼べるようにしてやれば、直接C#からObjective-Cの処理が呼べるという訳っぽい。
フィールドやメンバ変数・クラス情報等を取得したい場合、Objective-C Runtime Reference から欲しい機能を実装するのが良さそうだ。
ちなみに引数付きの呼び出し方だが、分からない。情報求む。
params(可変引数)で渡せば出来ると思ったんだけどなあ。
追記
IL2CPP環境下でも動作するみたい
*1:objc_msgSend等