LoginSignup
12
12

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-26

概要

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個ぐらい設定を変える必要がなくなったので、その分猫社員を撫でようと思った。

12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12