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

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

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

前回の検証ではUnityプラグイン(iOS/Objective-C版)の公式サンプルどおりにUnityプラグイン(iOS/Objective-C版)を実装し、iOS端末(iPhone6/iOS10.3.3)で動作することが確認できたので、今回はUnityプラグイン(iOS/Swift版)を検証してみようと思います。

【Swift言語について】
◆Appleが開発した、iOS、Mac、Apple TV、Apple Watch向けのアプリケーション開発用言語です。世の中にはプログラミング言語というコンピュータ向け言語は、なんと数千種類くらいあるそうですが、登場年度2014年というかなり新しい言語ですね。開発者はChris Lattnerさんという方です。Apple,Teslaという誰もが知っている有名な企業でソフトウェア開発者として勤務され、現在はGoogleで勤務されているようです。すごい人ですね。
そんなSwift言語、iOSアプリケーション向けのプログラミング言語なので、私にとっては非常に重要なプログラミング言語の1つです。Swift言語ユーザーとしての個人的な感想は、文法的な面でObjective-Cよりも読みやすくて扱いやすく、Closure、Tuple等は明示的に型が付いている言語のわりにはjavascriptみたいな印象で、Genericsサポートしてて便利ですね。英語なので読む分には他の言語(例えば韓国語やアラビア語)よりは比較的読みやすいので、総合評価的にはとても便利な印象です。

【どのようにしてUnityからSwiftを利用するのか?】
Unityプラグインプロジェクトで利用しているSwift言語(3.2)にはextern修飾子というものは存在しません。なので、.NETFrameworkのManagedCodeからSwiftを直接呼び出すことは不可能のようですね。
一方で、Appleの公式ドキュメントによると、いわゆるブリッジと呼ばれる手法を用いてObjective-CとSwiftは相互で呼び出すことが可能のようです。

いかにも今回の検証の目的に沿った内容ですね。このブリッジ手法に、.NETFrameworkが提供しているManagedCodeからUnManagedCodeを呼び出す仕組みを組み合わせるとUnityプラグイン(iOS/Swift版)が実現できそうです。図にしてみるとこういうフローですね。


【検証その1:Objecitve-CからSwiftを利用する】
◆まずは、今回の検証で一番重要なObjecitve-CからSwiftを呼び出す仕組みの検証をします。
1.Swiftオブジェクトを定義します。SwiftオブジェクトはNSObjectを継承している必要があります。継承しないと、Objective-C Generated Inteface HeaderへSwiftオブジェクトの定義が反映されないようですね。テストプラグインの実装はiOS/Objective-C版と同じ四則演算です。
2.Xcodeの「Build Settings→Objective-C Generated Inteface Header Name」へ「<ProductName>-Swift.h」を設定します。(Unity5.xとは違ってUnity2017.3だと、iOSプロジェクトパブリッシュ時に勝手に定義してくれるので便利になってますね)

3.Objective-Cコードへ「Objective-C Generated Inteface Header」をインクルードします。
4.SwiftオブジェクトをObjective-Cの文法で実行します。

Objective-C→Swiftの疎通はこれで実証できました。一方で、UnityではUnManagedCode(Objective-C & Swift)からManagedCode(C#)へのコールバックを利用することも可能です。Unityプラグインプロジェクトで何点かプラグインを開発してみましたが、プラグイン実行結果をUnityへ通知するコールバックはとても便利ですね。

なので、Swiftからもこのコールバック機能を利用できるようにしなければなりません。そのためにはSwiftからObjective-C(というよりC言語)を介して、Unityへ通知をするフローになります。

【検証その2:SwiftからObjecitve-C(というよりC言語)を利用する】
1.Objective-C Bridging Header」を定義します。これは、SwiftからObjecitve-C言語で定義されたメソッドやオブジェクトを呼び出すために必要なヘッダーです。
2.XcodeのObjective-C Bridging Headerへ先ほど定義したブリッジヘッダを設定します。

3.SwiftでObjective-C(というよりC言語)で記述された関数(コールバックUIViewController等)を呼び出します。

これで、SwiftからObjective-C(というよりC言語)を呼び出すことが可能になりました。上記のApple公式ブリッジ技術へUnity(というよりMono(.NETFramewrok))のManagedCodeからUnManagedCodeを呼び出す仕組みを組み合わせると、Unity→.NETFramework→Objective-C→Swift、またはその逆といった手法が実現できそうです。

【検証その3:Unity→.NETFramework→Objective-C→Swiftを利用する】
1.Unity→.NETFramework→Objective-Cの呼び出し部分は前回のiOS/Objecitve-C版プラグインで実装しているので、これはそのまま利用します。
2.先ほど定義したSwiftオブジェクトをObjectvie-Cの文法で利用します。

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


「すげえ、本当に動いたぞ!」

「UnityからSwiftを利用する」という手法は、聞いただけだとイメージがつきませんが、実際に実装してみると、UnityとAppleとMicrosoftから提供されている技術を組み合わせるだけで可能なとても簡単な手法であることがわかりました。今回までの検証で、Unityプラグイン(iOS版)は主要言語全てで実装可能であることが実証できたので、次回からはUnityプラグイン(Android版)の検証をしようと思います。