概要
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# のソースコードに反映する方法
- Library を作るときの Git の履歴から、project.pbxproj ファイルの変更行をコピーして、テキストエディタにコピペ
- テキストエディタの検索置換で正規表現を使って整形
- 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個ぐらい設定を変える必要がなくなったので、その分猫社員を撫でようと思った。