Help us understand the problem. What is going on with this article?

UnityのPBXProjectを今更少しだけ触ってみたのでメモ((φ(・д・。)

More than 3 years have passed since last update.

既存のpythonに手を加えないで実装をしたかったので、PBXプロジェクトを試してみることに

PBXProject
日本語のAPIリファレンスでは見つからないという罠。
試行錯誤なので、正しい実装かどうかもわからないのですが、とりあえず実装してみた。

実装したい内容

XcodeプロジェクトのBuild Phase > Copy Bundle Resourcesにファイルを追加したい。

実装

PBXProjectの機能

  • Unityから出力した Unity-iPhone.xcodeproj内のproject.pbxproj内を修正して変更を行う。
  • ファイルや設定のほとんどはGUIDで管理されているので、ファイルのGUIDを取得してきてそれを使用して処理する。

PBXProjectを取得

下記でプロジェクトを取得。
Unityのデフォルトなら、プロジェクト名とかも特に変更ないはず。
python等でプロジェクト名変更も考慮して、PostProcessBuildmの値は小さめに設定。

Sample.cs
using UnityEngine;          // Assetsのパス取得とかDebug用
using UnityEditor;          // BuildTargetとか用
using UnityEditor.Callbacks;// [PostProcessBuild(n)]用
using UnityEditor.iOS.Xcode;// PBXProject用
using System.IO;            // File

public class Sample {

    [PostProcessBuild(1)] // 実行順序 昇順で実行
    public static void OnPostprocessBuild( BuildTarget tgt, string path ) {
        if( tgt == BuildTarget.iOS )
        {
            // PBXプロジェクトファイルのフルパス
            string xcodeProjPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj";

            // プロジェクトファイルの読み込み
            PBXProject proj = new PBXProject();
            string file = File.ReadAllText( xcodeProjPath );
            proj.ReadFromString( file );    
            /*
             * proj.ReadFromFile( xcodeProjPath );
             * これでいい気がする。
             */

            // GUIDを取得
            string target = proj.TargetGuidByName( xcodeProj );

        }
}

ここで取得したguidを使用して、いろいろ設定を変更していきます。

AssetsからXcodeにファイルをコピーしてGUIDを取得

Unityでプラグイン認定されなかったファイルがXcodeに転送されないという悲しい展開があったので、手動でコピーします。
コピーはUnityEditorで用意されているFileUtiliryを使用すると楽チン!
(なんで、UnityEditorなんだろ・・・)

Sample.cs
    public static void OnPostprocessBuild( BuildTarget tgt, string path ) {
        if( tgt == BuildTarget.iOS )
        {
            ・・・
            // ファイルコピー
            FileUtil.CopyFileOrDirectory( Application.dataPath + "/masterFile.mst", path + "/masterFile.mst" );
            // GUIDを取得 物理パス(絶対パス)、相対パスで指定
            string fileGuid = proj.AddFile( path + "/masterFile.mst", "/masterFile.mst", PBXSourceTree.Source  );

            ・・・
        }
    }

プロジェクトに反映

取得してGUIDをPBXProjectに反映して書き込みます。

Sample.cs
    public static void OnPostprocessBuild( BuildTarget tgt, string path ) {
        if( tgt == BuildTarget.iOS )
        {
            ・・・
            // PBXProjectに設定
            proj.AddFileToBuild( target, privateKeyP12Guid );
            // 設定したデータを書き出す
            proj.WriteToFile( xcodeProjPath );
        }
    }

これで設定完了です。

まとめ

どうやってCopy Bundle Resourcesにデータを登録するの???とかいろいろ考えて時間がかかってしまっていたんですが、
XCode側がうまく設定してくれました。
指定して設定する関数が用意されてなかったので、本当に大変でした。。。

ただ、Unityリファレンスにしっかり書かれたらサンプルも増えて実装の幅が広がるのかなと思いました。

ちなみに、frameworkやコンフィグ周りの設定は下記のように書けば、簡単に設定可能です。

Sample.cs
    public static void OnPostprocessBuild( BuildTarget tgt, string path ) {
        if( tgt == BuildTarget.iOS )
        {
            ・・・
            proj.AddBuildProperty( target, ENABLE_BITCODE, "YES" );
            proj.AddFrameworkToProject( target, "abc.framework", isWeak );
            ・・・

        }
    }

最後までわからなかったこと(今後試したい)

  • PBXProjectの設定用の関数を外だししようをしたらエラーが鳴り止まず、無視してビルドしてみようとしたら、Unityが固まるという事態。どうやって外だしするんや・・・ ([PostProcessBuild(n)]内でしか動かない?)
  • proj.AddFile( path1, path2, PBXSourceTree.Source );のPBXSourceTreeの使い分け。
  • 同じくproj.AddFile()のパス指定。参考にしたPBXProject内のソースでは、相対パス、相対パスだった。。。リファレンスは違ったけども。。。
  • Copy Bundle Resourcesに勝手に設定される基準。勝手にやられるのは意味不明で気持ち悪い。
  • tdbとかdylib系の設定をしてないから、設定方法しっかりしておきたい。

追記
info.plistをいじる

yyama2
Unity とAndroid やってます。 メモ書きばっかになりますすいません.
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした