Version: 2022.1
言語: 日本語
Inside the iOS build process
iOS 用の開発を始める

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 プロジェクトは、以下の構造とターゲットを持ちます。

  • UnityFramework: UnityFramework ターゲットのライブラリ部分です。ClassesUnityFrameworkLibraries フォルダーと依存フレームワークが含まれており、Xcode は UnityFramework.framework ファイルをビルドに使用します。
  • Unity-iPhone: Unity-iPhone の薄いランチャー部分。MainApp フォルダーと、起動画面、.xib ファイル、アイコン、データ、/Info.plist ファイルなどのアプリケーションを示すデータを含み、ライブラリを実行します。Unity-iPhone ターゲットは、UnityFramework ターゲット上に 1 つの依存関係を持ちます。

Classes フォルダー

Classes フォルダーには Unity ランタイムと Objective-C を統合するコードが含まれています。 Unity はアプリケーションのエントリーポイントをこのフォルダー内の main.mmUnityAppController.mm/h ファイルに格納します。UnityAppController から派生する独自の AppDelegate を作成できます。または、プラグインのいずれかに AppController.h が含まれている場合は、代わりに UnityAppController.h を加えます。Plugins/iOS フォルダーに AppController.mm/h_ が含まれている場合は、それらをマージして名前を変更します。

さらに InternalProfiler.h ファイルは内部プロファイルを有効にするための条件付きのコンパイラーを定義します。このフォルダーは頻繁に変更しないコードのためのフォルダーで、カスタムクラスをここに配置できます。Append (追加) モードを選択すると、ビルド間でこのフォルダーに加えられた変更は維持されます。ただし、この機能は複数のビルドターゲットをサポートしないため、_Libraries_ フォルダーの構造を固定する必要があります。

Unity の内部プロファイラーは高速で干渉せず、また基本的な情報をフィードしてくれます。

  • どのサブシステムがフレーム時間を多く消費しているか
  • .NET ヒープサイズ
  • GC イベント数と継続時間

詳細については、ビルトインプロファイラー に関するドキュメントを参照してください。

Data フォルダー

このフォルダーには、アプリケーションのシリアル化されたアセットと、コードストリッピング設定に応じて完全なコードまたはメタデータとしての .NET アセンブリ (.dll または .datファイル) が含まれます。machine.config ファイルは、セキュリティや WebRequest などのさまざまな .NET サービスを設定します。Xcode はビルドごとにこのフォルダーのコンテンツを更新します。独自に変更を加えるべきではありません。

デフォルトでは、Data フォルダーの Target MembershipUnity-iPhone ターゲットで、Unity ランタイムは mainBundle でそれを検索します。Unity ランタイムは Data フォルダーを検索し、実行関数の 1 つを呼び出す前に UnityFramework インスタンスの setDataBundleId: "com.my.product" を呼び出します。例えば、UnityFramework の呼び出しとともに Data を使用したい場合は、setDataBundleId: "com.unity3d.framework" を使用して Target MembershipUnityFramework に設定します。

**ノート: ** オンデマンドリソースは、Data フォルダーが Application ターゲットの一部であり、UnityFramework ターゲットの一部ではない場合にのみサポートされます。

Libraries フォルダー

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 を遵守してください。

プロパティリスト (.plist) ファイル

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 でのみ表示されるフレームワークリンクが含まれます。

xcodebuild で Xcode プロジェクトをビルドする

コマンドライン引数を使用してビルド設定を指定する場合、すべての 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 プロジェクトを変更するには、Xcode.PBXProject を使用します。

プロジェクトターゲット

Unity 2019.3 で、PBXProject.GetUnityTargetNamepbxProject->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();

パッケージまたはカスタムビルドのポストプロセッサーで古いコードパスと新しいコードパスの両方をサポートする必要がある場合は、以下の手順を実行します。

  1. 可能な場合は常にプラグインインポーター機能に依存します (例えば、追加のフレームワークを指定する)。
  2. リフレクションを使用します。
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;
}
  • iOS ライブラリとしての Unity は 2019.3 で追加NewIn20193
Inside the iOS build process
iOS 用の開発を始める