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

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

More than 1 year has passed since last update.

概要

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

BlackCat
黒猫好きなプログラマ。
http://www.macneko.com/
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
ユーザーは見つかりませんでした