Unity Xcode プロジェクトの構造
iOS プラットフォーム用の Unity プロジェクトをビルドすると、Xcode プロジェクトを含むフォルダーが作成されます。アプリケーションをデバイスにデプロイする前に、このプロジェクトをコンパイルしてアプリケーションに署名する必要があります。また、App Store で分布するためのゲームの準備とバンドルにもプロジェクトを使用する必要があります。Unity as a Library を通して ネイティブの iOS アプリケーションへの Unity インテグレーションをサポートするために、Xcode のプロジェクト構造は Unity 2019.3 で変更されました。
Before you build your Project for iOS, make sure that you set the Bundle Identifier in the iOS Player Settings (menu: Edit > Project Settings > Player Settings). You can also choose whether your app targets the simulator or an actual device. To do this, change the SDK version field.
生成されたすべての Unity iOS Xcode プロジェクトは、以下の構造とターゲットを持ちます。
libGameAssembly.a
: A static library that contains all the project’s managed code, cross-compiled to C++, and built for iOS.il2cpp.a
: A static library that contains the IL2CPP runtime code to support your managed code.Classes フォルダーには Unity ランタイムと Objective-C を統合するコードが含まれています。 Unity はアプリケーションのエントリーポイントをこのフォルダー内の main.mm と UnityAppController.mm/h ファイルに格納します。UnityAppController から派生する独自の AppDelegate を作成できます。または、プラグインのいずれかに AppController.h が含まれている場合は、代わりに UnityAppController.h を加えます。Plugins/iOS フォルダーに AppController.mm/h_ が含まれている場合は、それらをマージして名前を変更します。
さらに InternalProfiler.h ファイルは内部プロファイルを有効にするための条件付きのコンパイラーを定義します。このフォルダーは頻繁に変更しないコードのためのフォルダーで、カスタムクラスをここに配置できます。Append (追加) モードを選択すると、ビルド間でこのフォルダーに加えられた変更は維持されます。ただし、この機能は複数のビルドターゲットをサポートしないため、_Libraries_ フォルダーの構造を固定する必要があります。
Unity の内部プロファイラーは高速で干渉せず、また基本的な情報をフィードしてくれます。
詳細については、ビルトインプロファイラー に関するドキュメントを参照してください。
このフォルダーには、アプリケーションのシリアル化されたアセットと、コードストリッピング設定に応じて完全なコードまたはメタデータとしての .NET アセンブリ (.dll または .datファイル) が含まれます。machine.config ファイルは、セキュリティや WebRequest などのさまざまな .NET サービスを設定します。Xcode はビルドごとにこのフォルダーのコンテンツを更新します。独自に変更を加えるべきではありません。
デフォルトでは、Data フォルダーの Target Membership は Unity-iPhone ターゲットで、Unity ランタイムは mainBundle
でそれを検索します。Unity ランタイムは Data フォルダーを検索し、実行関数の 1 つを呼び出す前に UnityFramework インスタンスの setDataBundleId: "com.my.product"
を呼び出します。例えば、UnityFramework の呼び出しとともに Data を使用したい場合は、setDataBundleId: "com.unity3d.framework"
を使用して Target Membership を UnityFramework に設定します。
**ノート: ** オンデマンドリソースは、Data フォルダーが Application ターゲットの一部であり、UnityFramework ターゲットの一部ではない場合にのみサポートされます。
Libraries フォルダーには IL2CPP の libil2cpp.a が含まれています。libiPhone-lib.a ファイルは Unity Runtime 静的ライブラリで、RegisterMonoModules.cpp は Unity ネイティブコードを .NET とバインドします。Xcode はこのフォルダーのコンテンツをすべてのビルドで更新します。独自の変更を加えるべきではありません。
ここにカスタムファイルを置くことができます。
アイコンとスプラッシュスクリーン (.png ファイル) は Unity-iPhone フォルダーにあるアセットカタログに保存されます。これらのファイルは Unity によって自動的に管理されます。起動画面、XML Interface Builder (.xib ファイル)、Storyboard ファイルは、プロジェクトのルートフォルダーに格納されます。Unity でそれらを設定するには、Player Settings ウィンドウ (Edit > Project Settings > Player Settings) で設定できます。カスタムの起動画像を作成する場合は、Apple の Human Interface Guidelines を遵守してください。
Unity の Player Settings (Edit> Project Settings> Player Settings に移動して、次に、Other セクションを選択し、Identification セクションまで下にスクロールします。 詳細については、iOS Player 設定 - Other settings を参照) から Unity-iPhone ターゲット (mainBundle
経由でアクセス可) 内の /Info.plist ファイルを管理できます。Unity がプレイヤーをビルドすると、このファイルを置き換えるのではなく更新します。必要がない限り、変更を加えないでください。
/UnityFramework/Info.plist ファイル (bundleWithIdentifier:@"com.unity3d.framework"
を通してアクセス可) は、UnityFramework の一部です。mainBundle の /Info.plist ファイルの代わりにここに値を維持して、UnityFramework を別のアプリケーションに移動する場合でも、これらの値を確実に取得することができます。
これらには XCode プロジェクトファイル (.xcodeproj ファイル)、および Project Navigator でのみ表示されるフレームワークリンクが含まれます。
コマンドライン引数を使用してビルド設定を指定する場合、すべての Xcode プロジェクトターゲットに影響します。これを防ぐために、一部のビルド設定には、サフィックスバージョンがあり、ビルド設定が影響を与えるターゲットを指定できます。これは User-Defined Settings (アプリケーションターゲットに使われる APP サフィックス とフレームワークサフィックスのための FRAMEWORK サフィックス) によって実装されます。
xcodebuild でビルドする場合は、以下のサフィックスを使用します。
PRODUCT_NAME -> PRODUCT_NAME_APP
PROVISIONING_PROFILE -> PROVISIONING_PROFILE_APP
PROVISIONING_PROFILE_SPECIFIER -> PROVISIONING_PROFILE_SPECIFIER_APP
OTHER_LDFLAGS -> OTHER_LDFLAGS_FRAMEWORK
カスタムビルドパイプラインに基づいて、リストを拡張して他の設定をカバーできます。
生成された Xcode プロジェクトを変更するには、Xcode.PBXProject を使用します。
Unity 2019.3 で、PBXProject.GetUnityTargetName
と pbxProject->TargetGuidByName("Unity-iPhone")
は非推奨になりました。代わりに、pbxProject->GetUnityFrameworkTargetGuid()
または pbxProject->GetUnityMainTargetGuid()
いずれかを使用できます。
// 非推奨
string targetGuid = proj.TargetGuidByName("Unity-iPhone");
string targetGuid = proj.TargetGuidByName(PBXProject.GetUnityTargetName());
// 代わりに、以下のいずれかを呼び出します
string targetGuid = proj.GetUnityFrameworkTargetGuid();
string targetGuid = proj.GetUnityMainTargetGuid();
パッケージまたはカスタムビルドのポストプロセッサーで古いコードパスと新しいコードパスの両方をサポートする必要がある場合は、以下の手順を実行します。
string mainTargetGuid;
string unityFrameworkTargetGuid;
var unityMainTargetGuidMethod = proj.GetType().GetMethod("GetUnityMainTargetGuid");
var unityFrameworkTargetGuidMethod = proj.GetType().GetMethod("GetUnityFrameworkTargetGuid");
if (unityMainTargetGuidMethod != null && unityFrameworkTargetGuidMethod != null)
{
mainTargetGuid = (string)unityMainTargetGuidMethod.Invoke(proj, null);
unityFrameworkTargetGuid = (string)unityFrameworkTargetGuidMethod.Invoke(proj, null);
}
else
{
mainTargetGuid = proj.TargetGuidByName ("Unity-iPhone");
unityFrameworkTargetGuid = mainTargetGuid;
}