こんにちは、エンジニアのオオバです。
UnityはiOSやAndroidといった各プラットフォームに対応している反面、 サポートできていない機能 もたくさんあります。
例えばOSアップデートによって登場した 新機能 です。実際にUnity側の対応は後回しになることもあります。しかし開発者としてはOSの新機能にいち早くアクセスしたくなりますよね。
そこでUnityは各プラットフォームの独自機能に対してプラグインという形でアクセスする方法を提供しています。
いわゆる 「ネイティブプラグイン」 です。
スマホゲームならiOS、Android、PCであればMac、Windows向けとさまざまなプラットフォーム向けにそれぞれネイティブプラグインを開発してネイティブ独自の機能にアクセスします。
- Unity → iOSの機能(ObjC/Swift/C++)
- Unity → Androidの機能(Java)
- Unity → Macの機能(ObjC/Swift/C++)
上記のようにiOS向けであればUnity(C#)からObjective-C(以下:ObjC)を使ってアクセスしてiOSの独自機能を使うというイメージです。
おもしろそうですよね。
そこで本記事ではiOS向けの 超簡単なiOSネイティブプラグイン を作っていきます。
以下のような方におすすめの記事となっています。
「ネイティブプラグインを書いたことがない」
「興味はあるがはじめ方がわからない」
「ネイティブプラグイン初心者 or 未経験者」
こんな方にぴったりです。
ちなみに今回はC++で実装していきますが、C++を書いたことがなくても分かる内容になっているので安心してください。
では早速本編に入っていきます。
👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!
ネイティブプラグインを使うとどんなことができるのか?
実際にネイティブプラグインを使うとどんなことができるのでしょうか。具体的にはプラットフォーム固有の機能が使えるようになります。
iOSの場合は以下のような機能がネイティブプラグインを通して扱えるようになるのです。
- ネイティブUI
- カメラ、フォトライブラリ
- 加速度センサー、ジャイロスコープ
- マイク、スピーカー
- Haptic Feedback
- バックグラウンド処理
- SNS共有機能
- メール・SMSの送信
などなど。
中にはUnityがサポートしている機能もあります。ネイティブプラグインを自分で実装することで自分好みの機能として作ることが可能です。
ネイティブプラグインとUnityの関係性
そもそもなぜネイティブプラグインを用意する必要があるのでしょうか。
それは 「C#から直接OSの機能にアクセスすることができないため」 です。
Unityがサポートする機能を使う場合は次のようなイメージです。
C#を使ってUnityを通してiOS機能にアクセスします。
一方UnityがサポートしていないOS機能にアクセスする場合は次のとおりです。
ネイティブプラグインを通してiOS機能にアクセスします。
このようにUnity側がサポートしていればわざわざネイティブプラグインを開発する必要はありません。しかしUnityがサポートしていないOS機能は大量にありますし、OSアップデートによって増えていきます。
あなたのプロダクトに必要且つUnityがサポートしていない機能はネイティブプラグインを書いて実装していくことになるのです。
iOSネイティブプラグインを作る前の準備
今回作成するiOSネイティブプラグインファイルは SamplePlugin.cpp です。このファイルを 「Assets/Plugins/iOS/」 に格納する必要があります。
「Pluginsフォルダ」はルート階層になくても大丈夫。「Assets/Hoge/Plugins/」でもOKです。
ネイティブプラグインのソースコードにもルールがあります。以下のコードのように extern "C" {}
と記述します。
extern "C"
{
// 処理を書く
}
以上で準備は完了したので具体的な処理を記述していきます。
iOSプラグイン側の実装
早速iOSネイティブプラグインの処理を記述していきます。
💻ソースコード : SamplePlugin.cpp
extern "C"
{
float _fooPluginFunction ()
{
return 42.8F;
}
}
このサンプルは呼び出すと 42.8
が返却されるシンプルなプラグインです。
iOSの機能にアクセスしたくなる気持ちはわかりますが、まずは UnityからiOSを扱う全体像をイメージを掴むことが非常に重要 です。
階段の2段、3段飛ばしは学習の挫折にもつながりやすいので、ベイビーステップで勉強していきましょう。
C#側の実装
続きましてプラグインを呼び出す側であるC#の実装を進めていきます。大きく手順は2つです。
[DllImport("__Internal")]
を記述static extern
で呼び出すプラグインメソッドを宣言
💻ソースコード : UsePlugin.cs
public class UsePlugin : MonoBehaviour
{
// 戻り値の型をあわせる必要あり
[DllImport("__Internal")]
static extern float _fooPluginFunction();
void Awake ()
{
var value = _fooPluginFunction();
// ネイティブプラグインから取得した値をログ出力
Debug.Log(value);
}
}
以上でネイティブプラグイン実装は完了です。動作は確認をしていきましょう。
ネイティブプラグインの動作確認
ネイティブプラグインの動作確認はiOS実機に書き出してから出ないと出来ません。
動作チェックはログを出力してXcodeのコンソールを見ながら確認します。
UnityでiOS向けビルドのやり方はこちらの記事を参考にしてみてください。
ビルドが成功したらXcodeのコンソールを確認してみましょう。
すると今回実装した「42.8」という数字がログとして表示されます。この状態になったら成功です。
思ったより簡単だったのではないでしょうか。ネイティブプラグイン開発よりUnityでビルドしたXcodeプロジェクトをiOS実機で動かす方が大変だったかもしれません。
もしiOSビルドに失敗する方はこちらの記事も参考にどうぞ。
iOSネイティブプラグイン入門まとめ
本記事ではiOSネイティブプラグイン入門として超簡単なプラグインを作ってみました。ネイティブプラグインって思っていたほど難しくなかったと思いませんでしたか?
動作確認には実機ビルドが必要という面倒臭さはありますが、Unityの外側の機能にアクセスできるという世界の広がりを感じられたのではないかと思います。
ぜひこれからもネイティブプラグインの学習を進めてUnityの外側に飛び出していってください。
使用したサンプルコードはこちらにアップしています。
ぜひご自分で実践して見てください。
また今回はiOS側からプラグインを通して値を取得するという超シンプルなサンプルでした。物足りない人も多いかと思います。そこで次のステップを用意しました。
↑こちらの記事ではiOSの機能にアクセスしてiOS端末ストレージ内のファイルの確認をするというプラグインの作り方を解説しています。ネイティブプラグインの知識を深めていきたい方はぜひ読んでみてください。

筆者のXをフォローしよう
「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
ぜひチャンネル登録をお願いします!
最後まで読んでいただきありがとうございました!
すばらしいiOSネイティブプラグインライフをお過ごしください。