参考はじめに初めまして。今回から、月一で寄稿させて頂くことになりました。日頃の開発で詰まったところなど、記事を通してナレッジをシェアしていきたいと思います!よろしくお願いします!!UnityのiOSネイティブとは?Unityはクラスプラットフォームのゲームエンジンなので、1つのプロジェクトで、同じゲーム等を様々なOSや端末で動作させることができます。中にはOSに依存する機能が必要な場合があります。下記のようなものが挙げられます。課金SNSシェアWebViewマップ表示(MapKit等)これらを実現するには「ネイティブ実装」を行うことが必要ですが、Unity本体やAssetStoreで入手できるプラグインによって実現できるものもあります。実現したい内容によっては自分で実装しなければならない場合もあります。そこで、今回はSwiftを使って、iOSのMapKitをUnityから呼び出してみたいと思います。今回作るものこのようなUnityのシーンにApple標準(MapKit)のマップを表示するサンプルアプリを題材に説明します。表示の際には、マップの表示位置・サイズと、ピン情報を指定できるものとします。必要な構成UnityのiOSネイティブはCで呼ばれるため、その部分はObjectiveC++で開発し、そこからさらにSwiftを呼ぶ形となります。どのように呼び出されるのか図にまとめました。この構造のため、SwiftはNSObjectを継承する必要があり、完全にSwiftで記述することはできないという欠点はあるものの、Optionalやstructなど、Swiftの恩恵は受けることができます。unity-swiftの導入Unityで書き出されるiOSプロジェクトは、Objective-Cベースなので、それにSwiftを共存させる設定が追加で必要になります。PathsはUnityからのビルド時に毎度設定する必要があります。そこで、下記のAssetを使用することにより、それらの設定を自動化することができます。https://github.com/miyabi/unity-swift今回は、こちらのAssetを使用していきます。Download」からダウンロードし、unity-swift.unitypackageを開き、プロジェクトに追加しておきます。必要な機能の実装ここからは、実際に必要な機能をプログラミングしていきます。Swiftクラスの作成Swiftクラスは、Assets内であればどこに作成しても構いません。呼び出されると、指定された情報でMKMapViewを生成し、addSubViewするメソッドを作成しました。@objcをつけて置かないと、Objective-C++から呼び出せないので、必ずつけておく。UnityGetGLView()でUnityで使用しているUIViewを取得できるので、そこにaddSubViewできる。Unityから送られてくるピン情報はJSONなので、パースする。@objcをつけて置かないと、Objective-C++から呼び出せないので、必ずつけておく。UnityGetGLView()でUnityで使用しているUIViewを取得できるので、そこにaddSubViewできる。Unityから送られてくるピン情報はJSONなので、パースする。$0.titlemapView.addAnnotation(annotation)}view.addSubview(mapView)}}メソッドを作成する際、@objcをつけておかないと、Objective-C++から呼び出せませんので、注意してください。JSONパースにCodableを使用していますので、structでモデルを作成します。Double}Codableについては、下記の過去記事に詳しく書いてありますので、興味のある方は読んでみてください。https://re-engines.com/2018/09/13/2650/Objective-C++でUnityからの呼び出しをSwiftに受け流す先述の通り、Unityから直にSwiftを呼び出すことはできず、Objective-C++(.mmファイル)もしくはcppへの呼び出しになります。Objective-C++が使用できれば、Swiftで書かれたメソッドを呼び出すこともできますので、今回はその方式で実装していきます。Objective-C++についてもどこに配置しても構いませんが、今回はSwiftファイルと同じ階層である「Assets/Scripts」に配置しました。最後に、C#クラスを作成していきます。これは、Unityでクラスを作成するいつも通りの方法で問題ありません。先ほど作成したCの関数と同じインタフェースをC#で記述することで、C#から呼出可能になります。それでは、C#でのインタフェース定義と、呼び出しを両方同時に見てみましょう。Objective-C++に記述した関数をC#クラスにも記載することで、C#から呼び出し可能になる。Objective-C++に記述した関数をC#クラスにも記載することで、C#から呼び出し可能になる。json);#endif}}最後に、ピンの情報を持つモデルを作成します。places;}UnityのJsonUtilityでは、配列がルートのJSONを取り扱うことができないため、ルートをJSONObjectにするためのPlaceListというモデルを作成しました。「UnityMapKit.cs」をシーンに配置して、マップピンの情報を予めセットしてみました。ビルドして実機で確認これで完了です。ビルドするとシーンにマップが表示されます。SwiftのバージョンでエラーになってしまうときはUnityが出力するiOSプロジェクトでは、Swiftバージョンの指定がないため、エラーとなってしまいます。4.0」等に変更することで解消できます。おまけ:SwiftからUnityを呼び出すには?Swiftが呼び出された時、すぐ値を返却したいのであれば、Cの関数の返却をvoidではなく返り値を設定すれば良いのですが、後からUnityを呼び出したい場合は、下記の構文を使用することができます。上記メソッドの第一引数に渡す情報(文字列のみ)この場合、呼び出されるC#側のメソッドは下記になります。message)第三引数が文字列固定のため、複数データを渡すときは、JSONでやり取りすることがオススメです。さいごにUnityからSwiftを呼び出すまで、複数の仕組みや言語を経由する必要があり、面倒ではありますが、ネイティブをObjective-CではなくSwiftで書けることはとてもありがたいです。コメントをキャンセルメールアドレスが公開されることはありません。コメント名前メールアドレスサイト上に表示された文字を入力してください。ChartsライブラリとCryptowatchAPIでローソク足を描画してみる。私たちは無料アプリもリリースしています、ぜひご覧ください。下記のアイコンから無料でダウンロードできます。