ごんれのラボ

iOS、Android、Adobe系ソフトの自動化スクリプトのことを書き連ねています。

Unity で Xcode のプロジェクトを生成後に必要な設定を Unity の Script で自動化する方法

概要

Qiita に投稿した下記記事と同じ内容です。
qiita.com

iOS 用の Cocoa Touch Static Library を作ったものの、Unity でビルドが通らず、Xcode の Build Settings を変更する必要があった。
毎回手作業で変更するには項目数が多すぎたのと、自分以外の環境でビルドできないと意味がないので、自動化する方法がないか調べてみた。

Cocoa Touch Static Library を作る方法

下記を参考にしました。
UnityでAndroid、iOS両対応のC++プラグインの実装
Unity & iOSプラグイン連携
[Unity] C#とObjective-Cの連携まとめ

自動化する方法

下記を参考にしました。
UnityでXcodeの設定を自動化する方法まとめ

コピペですが、一応、ソースコード。

XcodeSettingsPostProcesser.cs

using System.IO;
using UnityEngine;
using UnityEditor;
using UnityEditor.iOS.Xcode;
using UnityEditor.Callbacks;
using System.Collections;

public class XcodeSettingsPostProcesser
{
    [PostProcessBuildAttribute(0)]
    public static void OnPostprocessBuild(BuildTarget buildTarget, string pathToBuiltProject)
    {
        // iOS以外のプラットフォームは処理を行わない
        if (buildTarget != BuildTarget.iOS)
        {
            return; 
        }

        // PBXProjectの初期化
        var projectPath = pathToBuiltProject + "/Unity-iPhone.xcodeproj/project.pbxproj";
        PBXProject pbxProject = new PBXProject();
        pbxProject.ReadFromFile(projectPath);
        string targetGuid = pbxProject.TargetGuidByName("Unity-iPhone");

        // ここに自動化の処理を記述する
        pbxProject.AddBuildProperty(targetGuid, "CLANG_ENABLE_MODULES", "NO");
        pbxProject.AddBuildProperty(targetGuid, "CLANG_ENABLE_MODULE_DEBUGGING", "YES");
        pbxProject.AddBuildProperty(targetGuid, "CLANG_ENABLE_OBJC_ARC", "NO");

        // 設定を反映
        File.WriteAllText(projectPath, pbxProject.WriteToString());
    }
}

少しでも楽に設定を C# のソースコードに反映する方法

  1. Library を作るときの Git の履歴から、project.pbxproj ファイルの変更行をコピーして、テキストエディタにコピペ
  2. テキストエディタの検索置換で正規表現を使って整形
  3. C# のソースコードにコピペ

検索パターン

\t\t\t\t"?(.+?)"? = "?(.+?)"?;$

置換パターン

pbxProject.AddBuildProperty(targetGuid, "\1", "\2");

置換前のテキスト

             CLANG_ENABLE_MODULES = NO;
                CLANG_ENABLE_MODULE_DEBUGGING = YES;

置換後のテキスト

pbxProject.AddBuildProperty(targetGuid, "CLANG_ENABLE_MODULES", "NO");
pbxProject.AddBuildProperty(targetGuid, "CLANG_ENABLE_MODULE_DEBUGGING", "YES");

環境によって検索側のパターンは変える必要があると思う。
あと、AddBuildProperty は設定を追加するので、Unity がビルド時に設定を追加していると、「Unity が書き換えた設定 + Script で追加した設定」というおかしな状態になるので、必要に応じて関数を変えないとダメ。

感想

毎回手作業で40個ぐらい設定を変える必要がなくなったので、その分猫社員を撫でようと思った。