渋谷ほととぎす通信

「Unityをわかりやすく」初心者のためのゲーム作りブログ

【Xcode】UnityにiOSフレームワークを自動追加する方法

【Xcode】UnityにiOSフレームワークを自動追加する方法

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

お悩みさん
お悩みさん
  • iOSフレームワークの手動追加が面倒くさい
  • Unityでフレームワーク追加を自動化できる?
  • iOSフレームワークファイルの場所ってどこ?
  • オオバ
    オオバ
    本記事ではこれらの悩みを解決します。

    結論から話しますと、UnityでiOSフレームワークファイルを自動追加できます。つまり、UnityからXcodeプロジェクトを書き出すと、自動でiOSフレームワークが追加された状態になるということです。

    Xcodeのビルド設定にiOSフレームワークを手動で追加するのは本当に面倒くさいですよね。1度ならまだしもゲーム開発中は何度も実機ビルドすることになります。そのたびに手動作業が発生するというのは時間の無駄です。

    この記事はUnityからiOSフレームワークをXcodeプロジェクトに埋め込む方法を分かりやすく紹介します。また iOSフレームワークファイルを埋め込む際に使用する元ファイルの格納場所 も解説します。最後まで読んで開発の時短に役立ててください。

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

    なぜUnity開発でiOSフレームワークが必要なのか?

    Unityが提供する機能だけを使ってゲームやアプリの開発をする際は、基本的にiOSフレームワークは不要です。必要になるケースは「Unityが提供しない機能を使う場合」です。

    具体的には、iOSが提供するOS機能を使う場合です。Unityは万能ではありません。Unityも内部的にはiOSのOS機能にアクセスしています。それをぼくたちはC#からアクセスしているということです。

    つまりUnityが提供していない機能は、独自にネイティブプラグインを開発して、OS機能にアクセスする必要があるのです。そのOS機能を動かすためにフレームワークを必要としているのです。

    フレームワークファイルが足りない場合、次の記事で紹介しているエラーが発生することがあります。あわせて読んでみてください。

    UnityからiOSフレームワークを自動セットする方法

    ではUnityからXcodeビルドする際にiOSフレームワークを自動でセットする方法を紹介します。

    【Xcode】UnityにiOSフレームワークを自動追加する方法_0

    結論から話すと上図のとおり「Plugins/iOS」フォルダに格納するだけ。とても簡単です。

    昔のUnityは「ポストプロセス」と呼ばれるビルドの後処理を実装する必要がありました。執筆時(Unity2018.3)ではフレームワークファイルを一式「Plugins/iOS」配下に入れるだけでOKです。

    しかし、フレームワークの中にはUnityプロジェクトに格納するだけではXcodeに自動セットされないものも存在します。記事後半「【注意】 Unityで自動セットできないフレームワーク」で詳しく解説します。

    Xcodeアプリの中身を見る方法

    iOSフレームワークを手に入れるためにXcodeの中身を見る必要があります。そもそもアプリの中身を見る方法が分からない方向けに2つ方法を紹介します。

    方法①Finderを使用「パッケージの内容を表示」

    Applicationフォルダ内の「Xcode.app」を探しましょう。
    まずはXcode.appを右クリック。「パッケージの内容を表示」をクリックします。

    【Xcode】UnityにiOSフレームワークを自動追加する方法_1

    するとXcodeの中身を確認できます。

    方法②ターミナルを使う方法

    ターミナルで以下のコマンドを実行すると中身がFinderで開きます。

    $ open /Applications/Xcode.app/Contents  
    

    Xcodeアプリの中身を確認する方法はFinder、ターミナルどちらでも良いのですが、これから紹介する「iOSフレームワークファイルの探し方」でターミナルを使用します。

    そんな訳でターミナルを使ってXcodeの中身を見れるようになっておくことをおすすめします。

    iOSフレームワークファイルの探し方

    Unityプロジェクトに格納するためには、iOSフレームワークファイルを手に入れる必要があります。
    結論、 iOSフレームワークファイルはXcodeアプリの中 です。

    例えば「CloudKit.framework」であれば、次のディレクトリに格納されています。

    Xcodeフレームワークファイル格納先
    Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform  
    /Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/  
    

    【Xcode】UnityにiOSフレームワークを自動追加する方法_2

    このように全てのフレームワークファイルがXcode内に格納されています。

    【注意】フレームワークによって格納場所は異なる

    フレームワークによって格納場所が異なることに注意しましょう。例えば「libz.tbd」です。先ほど紹介した「CloudKit.framework」と場所が違います。

    Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform  
    /Developer/SDKs/iPhoneOS.sdk/usr/lib  
    

    上記の場所に格納されています。ややこしいですね。

    【Xcode】UnityにiOSフレームワークを自動追加する方法_3

    iOSフレームワークの名前を手がかりに探す方法

    ターミナルを使って findコマンド で検索します。

    # Xcode.appの中に潜る
    $ cd /Applications/Xcode.app/Contents  
    
    # Xcode.appの中身を検索
    $ find . -name ファイル名  
    
    Xcode.appの中からlibz.tbdを検索するDEMO

    【Xcode】UnityにiOSフレームワークを自動追加する方法_4

    このようにiOSフレームワークの格納場所はファイルによってさまざまです。ターミナルを使ってさくっと探し出すことをおすすめします。

    【注意】 Unityで自動セットできないフレームワーク

    iOSフレームワークはUnityプロジェクトに格納すると自動でXcodeプロジェクトにセットされると解説しましたが、例外があります。

    拡張子「.tbd」を持つファイルは、Unityプロジェクトに格納する方法では動きません。

    このような例外ファイルを自動化する方法を紹介します。

    tbdファイルはPostProcessBuildを使う

    結論、従来のPostProcessBuildを実装することで「tbd」ファイルをXcodeに自動でセットします。以下のようなPostProcessBuild処理を実装してみてください。

    using UnityEditor;  
    using UnityEditor.Callbacks;  
    #if UNITY_IOS
    using UnityEditor.iOS.Xcode;  
    #endif
    
    public static class PostProcessBuild  
    {
        [PostProcessBuild]  
        public static void OnPostProcessBuild(BuildTarget buildTarget, string path)  
        {
    #if UNITY_IOS
            string projectPath = PBXProject.GetPBXProjectPath(path);  
    
            PBXProject pbxProject = new PBXProject();  
            pbxProject.ReadFromFile(projectPath);  
    
            string target = pbxProject.TargetGuidByName("Unity-iPhone");  
            const TbdFile = "hogehoge.tbd";  
            pbxProject.AddFrameworkToProject(target, TbdFile, false);  
            pbxProject.WriteToFile(projectPath);  
    #endif
        }
    }
    

    まとめ

    この記事ではiOSフレームワークをUnityから自動セットする方法を紹介しました。簡単に記事の内容をまとめます。

    iOSフレームワークをUnityから自動セットする方法

    ①iOSフレームワークはUnityが提供しない機能を使うときに必要

    ②iOS/PluginsにiOSフレームワークを格納するとXcodeに自動セット

    ③iOSフレームワークはXcodeアプリの中にある

    ④フレームワークの種類によっては自動セットのためにPostProcessBuildが必要

    こんな感じです。

    iOSネイティブプラグインを作るときには必要になるテクニックです。
    Unityが提供する機能だけでも十分面白いゲームを作ることは可能ですが、少し凝ったことをやる場合はどうしてもネイティブプラグインが必要になります。

    もしUnityでネイティブプラグインを開発するときはこの記事を思い出してみて、開発を効率化してみてください。

    この記事があなたのゲーム開発に少しでもお役に立てたら嬉しいです。

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

    最後まで読んでいただきありがとうございました!
    すばらしいXcodeライフをお過ごしください。

    オススメ記事
    検証環境
    • Xcode 10.1
    • Unity2018.3