こんにちは、エンジニアのオオバです。

お悩みさん
お悩みさん
  • Unityが提供していないiOS機能にアクセスしたい
  • ネイティブプラグインが必要?
  • C#だけでは無理?
  • オオバ
    オオバ
    本記事ではこれらの悩みを解決します。

    UnityはiOSやAndroidといった各プラットフォームに対応している反面、 サポートできていない機能 もたくさんあります。

    例えばOSアップデートによって登場した 新機能 です。実際にUnity側の対応は後回しになることもあります。しかし開発者としてはOSの新機能にいち早くアクセスしたくなりますよね。

    そこでUnityは各プラットフォームの独自機能に対してプラグインという形でアクセスする方法を提供しています。

    いわゆる 「ネイティブプラグイン」 です。

    スマホゲームならiOS、Android、PCであればMac、Windows向けとさまざまなプラットフォーム向けにそれぞれネイティブプラグインを開発してネイティブ独自の機能にアクセスします。

    上記のようにiOS向けであればUnity(C#)からObjective-C(以下:ObjC)を使ってアクセスしてiOSの独自機能を使うというイメージです。

    おもしろそうですよね。

    お悩みさん
    お悩みさん
    でもネイティブプラグインを作るのって難しそう

    そこで本記事ではiOS向けの 超簡単なiOSネイティブプラグイン を作っていきます。

    以下のような方におすすめの記事となっています。

    「ネイティブプラグインを書いたことがない」
    「興味はあるがはじめ方がわからない」
    「ネイティブプラグイン初心者 or 未経験者」

    こんな方にぴったりです。

    ちなみに今回はC++で実装していきますが、C++を書いたことがなくても分かる内容になっているので安心してください。

    では早速本編に入っていきます。

    👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

    ネイティブプラグインを使うとどんなことができるのか?

    実際にネイティブプラグインを使うとどんなことができるのでしょうか。具体的にはプラットフォーム固有の機能が使えるようになります。

    iOSの場合は以下のような機能がネイティブプラグインを通して扱えるようになるのです。

    などなど。

    中にはUnityがサポートしている機能もあります。ネイティブプラグインを自分で実装することで自分好みの機能として作ることが可能です。

    ネイティブプラグインとUnityの関係性

    そもそもなぜネイティブプラグインを用意する必要があるのでしょうか。

    それは 「C#から直接OSの機能にアクセスすることができないため」 です。

    Unityがサポートする機能を使う場合は次のようなイメージです。
    【Unity】iOSネイティブプラグイン入門_0
    C#を使ってUnityを通してiOS機能にアクセスします。

    一方UnityがサポートしていないOS機能にアクセスする場合は次のとおりです。
    【Unity】iOSネイティブプラグイン入門_1
    ネイティブプラグインを通してiOS機能にアクセスします。

    このようにUnity側がサポートしていればわざわざネイティブプラグインを開発する必要はありません。しかしUnityがサポートしていないOS機能は大量にありますし、OSアップデートによって増えていきます。

    あなたのプロダクトに必要且つUnityがサポートしていない機能はネイティブプラグインを書いて実装していくことになるのです。

    iOSネイティブプラグインを作る前の準備

    今回作成するiOSネイティブプラグインファイルは SamplePlugin.cpp です。このファイルを 「Assets/Plugins/iOS/」 に格納する必要があります。

    【Unity】iOSネイティブプラグイン入門_2

    「Pluginsフォルダ」はルート階層になくても大丈夫。「Assets/Hoge/Plugins/」でもOKです。

    ネイティブプラグインのソースコードにもルールがあります。以下のコードのように extern "C" {} と記述します。

    extern "C"  
    {
        // 処理を書く  
    }
    

    以上で準備は完了したので具体的な処理を記述していきます。

    iOSプラグイン側の実装

    早速iOSネイティブプラグインの処理を記述していきます。

    💻ソースコード : SamplePlugin.cpp
    extern "C"  
    {
        float _fooPluginFunction ()  
        {
            return 42.8F;  
        }
    }
    

    このサンプルは呼び出すと 42.8 が返却されるシンプルなプラグインです。

    お悩みさん
    お悩みさん
    iOSの機能にアクセスしないの?

    iOSの機能にアクセスしたくなる気持ちはわかりますが、まずは UnityからiOSを扱う全体像をイメージを掴むことが非常に重要 です。

    階段の2段、3段飛ばしは学習の挫折にもつながりやすいので、ベイビーステップで勉強していきましょう。

    C#側の実装

    続きましてプラグインを呼び出す側であるC#の実装を進めていきます。大きく手順は2つです。

    1. [DllImport("__Internal")] を記述
    2. 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のコンソールを確認してみましょう。

    【Unity】iOSネイティブプラグイン入門_3

    すると今回実装した「42.8」という数字がログとして表示されます。この状態になったら成功です。

    思ったより簡単だったのではないでしょうか。ネイティブプラグイン開発よりUnityでビルドしたXcodeプロジェクトをiOS実機で動かす方が大変だったかもしれません。

    もしiOSビルドに失敗する方はこちらの記事も参考にどうぞ。

    iOSネイティブプラグイン入門まとめ

    本記事ではiOSネイティブプラグイン入門として超簡単なプラグインを作ってみました。ネイティブプラグインって思っていたほど難しくなかったと思いませんでしたか?

    動作確認には実機ビルドが必要という面倒臭さはありますが、Unityの外側の機能にアクセスできるという世界の広がりを感じられたのではないかと思います。

    ぜひこれからもネイティブプラグインの学習を進めてUnityの外側に飛び出していってください。

    使用したサンプルコードはこちらにアップしています。

    ぜひご自分で実践して見てください。

    また今回はiOS側からプラグインを通して値を取得するという超シンプルなサンプルでした。物足りない人も多いかと思います。そこで次のステップを用意しました。

    ↑こちらの記事ではiOSの機能にアクセスしてiOS端末ストレージ内のファイルの確認をするというプラグインの作り方を解説しています。ネイティブプラグインの知識を深めていきたい方はぜひ読んでみてください。

    「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
    ぜひチャンネル登録をお願いします!

    最後まで読んでいただきありがとうございました!
    すばらしいiOSネイティブプラグインライフをお過ごしください。

    オススメ記事
    参考サイト