Unityプラグインを開発しよう:その2:プラグイン解析(iOS/Objective-C版) | U-CREATES.の「たぶん」まいにち制作中。

U-CREATES.の「たぶん」まいにち制作中。

◆Webサイト、スマートフォンアプリ制作をしている個人事業主のブログです。
◆オフィシャルWebサイトはこちら。
http://u-creates.com/

Unityの公式ドキュメントに掲載されているプラグインのサンプルのうち、iOS版から解析を開始しました。静的/動的解析を実施したところ、ソースコード群(Bonjour.csBonjourClientImpl.mm)のうちextern修飾子DllImportAttributeが重要な役割を担っていることがわかりました。

【公式ドキュメントから抜粋したUnityプラグイン開発でのポイントとなる機能】
◆extern修飾子
一般に、相互運用サービスを使用してアンマネージ コードを呼び出すときに、DllImport 属性と共に使用します。
◆DllImport
属性付きメソッドがアンマネージ ダイナミックリンク ライブラリ (DLL) によって静的エントリ ポイントとして公開されることを示します。

・・・Unityプラグイン(iOS版)、どうも.NETFrameworkの機能の一部を利用して実現しているみたいですね。
サンプルコードを読み進めていくと、__Internalという単語が目に止まります。


DllImportのコンストラクタの仕様を見てみると「string dllName」と書いてあるので、__Internalとはどうもリンクされる動的リンクライブラリ名のようですが、Unityの公式ドキュメントから、__InternalとはどうもUnity固有の静的リンクライブラリみたいです。


サンプルコードの解析の結果、なんとなく理屈は理解したので実装できそうですが、実際に組み立てて動作するのだろうか。と思ったので、検証用のテストプラグインを開発してみました。

【テストプラグインの実装:Unityプラグイン(iOS/Objectice-C版)】
◆実装はこれです。
◆ManagedCodeへ「extern 修飾子は一般に、相互運用サービスを使用してアンマネージ コードを呼び出すときに、DllImport 属性と共に使用します。」という実装を施しました。
◆ManagedCodeから呼び出される「UnManagedCode群」です。・・・iOS、バージョン5(iOS5)からARC(Automatic Reference Counting)が導入されているので、メモリ管理は勝手にしてくれますが、.NETのManagedCodeの定義には該当しないので、.NETから見たらUnManagedCodeですね。
UnManagedCodeのテストプラグインです。単純に四則演算をして、演算結果を返すだけのとても簡単な実装です。

このような実装を施したUnityテストプラグインを、手元にあるiPhone(iPhone6/iOS10.3.3)へインストールして動かしてみると、


UnManagedCodeで行った演算結果が表示されましたね(UnityEditorで実行すると0が返却されます。)。

ログにも呼び出し経緯が記録されました。ログはiOSSDKから提供されているNSLogという機能を用いて出力しているので、iOSSDKも利用することが可能だということが実証されました。

また、試しにObjective-Cで記述されたnative側のエントリポイントを消してビルドするとこのようなエラーが出ます。


公式ドキュメント通り、__Internalは静的リンクでしたね。

・・・検証により、Unityプラグイン(iOS/Objective-C版)の開発が実現できそうです。次回はUnityプラグイン(iOS/Swift版)を検証してみたいと思います。