はい。なんの事かわかりづらいタイトルですみません。頑張って一つずつ解説
してくのでお付き合いを。
アプリ開発するときに、効率化するための処理になります。
ずばり、Unityからiosのネイティブ機能を呼び出す方法について
書いていきます。少々難しい内容ですが、あまり書籍や情報がなく
少々苦労したため当ブログで解説しておき、同じような方に役立てばいいなと思います。
iOSネイティブ機能って何?
iosは、iphoneを動かしているソフトウェアです。パソコンに入ってるウィンドウズと同じです。
それでは、iosネイティブ機能とはなんなのか?
簡単に説明すると、「iphoneにもともと搭載されている機能」のことです。音楽を出力したり、写真を見たり、カメラを使ったりといったところです。
例えばiphoneで音楽アプリを作ろうとした場合、音楽ファイルのデコード処理をゼロから作成するのは非常に面倒で難しいですよね。
もともとiphoneには音楽を再生する機能があるので、それを利用する
方がアプリ開発の効率が良いです。
このようにiphone(ios)にもともと搭載している機能をネイティブ機能と
呼び、今回はUnityからこのiOSのネイティブ機能を呼び出す方法についてご紹介していきます。
UnityのプログラムとiOSプログラムは違う言語が使われている!
Unityはゲームを制御するプログラムにC#というプログラミング言語を使用します。
一方iOSはSwiftまたはObjective-Cという言語を利用します。
このようにUnityとiOSでは使用している言語が異なるため
C#にiOSネイティブの処理を直接書くことはできませんが
iOS用のネイティブプラグインとしてUnityからObjectiveCを
呼び出すことが可能です。
UnityのiOSプラグインの作り方
UnityではPluginsフォルダ直下の「iOS」フォルダを自動的にXcodeプ
ロジェクトにファイルがエクスポートされます。
ここにiOSネイティブで動くObjective-Cのプログラムを作成します。
今回はtest.mmというファイルでプログラムを作成しました。
ログに「Hello World!」と表示するだけの簡単なネイティブプログラムです。
1 2 3 4 5 6 7 8 9 10 11 |
#ifdef __cplusplus extern "C" { #endif // C#から呼ばれる関数 const void Sample() { NSLog(@"Hello World!"); } } #ifdef __cplusplus } #endif |
Unity側では次のように書きます。
1 2 3 4 5 6 7 8 9 |
//関数宣言 [DllImport("__Internal")] private static extern void Sample(); // Update is called once per frame void Update() { sampleMethod1(); } |
[DllImport(“__Internal”)]と書くことでネイティブプラグインをインポートすることができます。
あとはネイティブプラグインで定義した関数を呼び出すだけでOKです。
これをUnityから呼び出してみます。
XcodeのコンソールにHello!Worldと表示され、UnityのC#からObjective-Cが正常に呼び出されていることが確認できました。
ネイティブプラグインの戻り値をUnityから受け取れる?
UnityからObjectiv-Cを呼び出すことはできました。
先ほどのサンプルでは単純にXcodeのコンソールに文字を表示しただけですが、これではあまり意味がないため、ネイティブプラグインの結果をUnityで受け取ってみます。
Objective-C側のプログラム
1 2 3 4 5 6 7 8 9 10 11 12 |
#ifdef __cplusplus extern "C" { #endif // C#から呼ばれる関数 const char * Sample() { return strdup([@"Hello World! form Objective-C!" UTF8String]); } #ifdef __cplusplus } #endif |
strdupを利用することでnsstring型をUTF−8の文字列として
メモリを確保、保存し、そのポインタをリターンします。
このポインタを利用してをUnity側からメモリに格納した情報を取得
することが可能です。
Unity側
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; //DLL読むのに必要 using System.Runtime.InteropServices; public class test:MonoBehaviour { public Text sysinfo; //関数宣言 [DllImport("__Internal")] private static extern string Sample(); // Update is called once per frame void Update() { sysinfo.text = Sample(); } } |
先ほどとほとんど同じですが、16行目の関数定義でstringをリターンする
関数として定義しています。
受け取ったデータはUnity側でテキストオブジェクトに表示するように
しています。
このようにiOSのネイティブ機能をUnityから呼び出すことができます。
ネイティブ機能が利用できるということでiPhoneで再生されている曲情報なんかもUnityから参照することが可能になります。
Unityで現在再生中の曲情報を表示する
基本的にはこれまでに実施した内容とおなじで、まずはネイティブで
曲情報をメモリに格納するコードを書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#import <MediaPlayer/MediaPlayer.h> #ifdef __cplusplus extern "C" { #endif // C#から呼ばれる関数 const char * Sample() { //再生中の曲情報取得 MPMediaItem *item = [[MPMusicPlayerController systemMusicPlayer] nowPlayingItem]; NSString *str = [NSString stringWithFormat:@"%@\n%@\n%@\n%f", item.title, item.artist,item.albumTitle,item.playbackDuration]; return strdup([str UTF8String]); } #ifdef __cplusplus } #endif |
このコードをUnityのゲームオブジェクトにアタッチして実行すると
次のようになります。
実行結果
画面に表示されている文字とiPhoneのコントロールセンターの再生中の楽曲名が一致していることがわかると思います。
もしうまく楽曲名が表示されない場合はXcodeでinfo.plistの「Privacy -Media Library Usage Description」が追加されていない可能性があるのでチェックしてみてください。
このように、iPhoneのネイティブ機能でもUnityのネイティブプラグインを利用することで簡単に呼び出すことができました。
ネイティブ機能が利用できるということは、カメラや音楽、アルバム等と連携することも可能です。ぜひ色々試してみてください。それでは、また。