テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

UnityのC#からネイティブプラグインを経由せずObjective-Cのコードを呼び出す

先日、ネイティブプラグインを使用せずにObjective-Cのコードを呼び出す方法を教えてもらった。これを使用すると、AndroidObjectのようにObjective-Cのコードが取得できる。

 

やり方

まず以下のコードを用意する。

UnityのC#からNativePluginsを使わずObjective-C++を呼び出すテスト

 

これを導入すると、以下のコードのように、Objective-Cのコードを直接呼び出すことが可能となる。

以下のコードでは、Objective-Cで定義したクラスをC#側で生成・管理している。

gist1de75fafc8fa2f25c0e4

現状は、「インスタンスが取得できる」もしくは「静的なメソッド」で「引数が無いもの」ならば概ね直接呼べるっぽい。

 

原理

さて、これの原理だが、どうやらObjective-Cは[Object Method:argument] と呼ぶ際、実際はobjc_msgSend(id, method, argument....) のコードを生成し実行しているらしい。要するに間接的な形でメソッドを実行する。

そのため、そのメソッドを登録し実行する処理*1自体をDllImportでC#から呼べるようにしてやれば、直接C#からObjective-Cの処理が呼べるという訳っぽい。

フィールドやメンバ変数・クラス情報等を取得したい場合、Objective-C Runtime Reference から欲しい機能を実装するのが良さそうだ。

 

ちなみに引数付きの呼び出し方だが、分からない。情報求む。

params(可変引数)で渡せば出来ると思ったんだけどなあ。

追記

IL2CPP環境下でも動作するみたい

伊藤周@Unite早割は3/1まで on Twitter: "UnityのC#からネイティブプラグインを経由せずObjective-Cのコードを呼び出す - テラシュールブログ http://t.co/IaXUSuZLTx やったー!IL2CPP使って64bitでも動いたー。これ超便利でいいねえ。いちいちインターフェースを書かなくて済む"

*1:objc_msgSend