Version: 2021.2
言語: 日本語
APK 拡張ファイル (OBB) のサポート
Android のグラフィックス

Play Asset Delivery

Play Asset Delivery (PAD) は、150 MB を超えるアプリケーションを配信する際に使用する Google Play ストアの機能です。PAD は、APK 拡張ファイル (OBB) を使用して追加のアセット (テクスチャ、サウンド、メッシュなど) を保存する代わりに、アセットパックを使用します。Google はアセットパックを Google Play でホストして提供するため、アプリケーションリソースをユーザーに送信するためのコンテンツ配信ネットワークを構築する必要がありません。PAD の詳細については、Android の Play Asset Delivery を参照してください。

重要: PAD は、Google Play ストアでのみ使用できます。大規模なアプリケーションを他のデジタル配信サービスに対応させたい場合は、APK 拡張ファイル (OBB) を利用してください。

Play Asset Delivery の利用

Play Asset Delivery を使用するには、Android App Bundles をビルドし、アプリケーションバイナリを分割できるようにプロジェクトを設定する必要があります。

Unity を設定して Android App Bundle をビルドするには、以下を行います。

  1. Build Settings を開きます (File > Build Settings)。
  2. PlatformAndroid を選択します。
  3. Export Project が有効の場合、Export for App Bundle を有効にします。それ以外の場合は、Build App Bundle (Google Play) を有効にしてください。

アプリケーションのバイナリを分割するように Unity を設定するには、以下を行います。

  1. Player 設定を開きます (Edit > Project Settings を選択し、Player カテゴリを選択)。
  2. Android 設定タブを選択し、Publishing Settings セクションを選択します。
  3. Split Application Binary を有効にします。

アプリケーションをビルドすると、Unity は、アプリケーションを ベースモジュール とアセットパックに分割したものを含む Android App Bundle を生成します。

  • ベースモジュール: 最初のシーンの実行ファイル (Java およびネイティブ)、プラグイン、スクリプト、アセットを含みます。最初のシーンとは、ビルドインデックス が 0 のシーンのことです。
  • アセットパック: 残りのシーン、リソース、ストリーミングアセットなど、すべてが含まれています。Unity がビルド時に生成するアセットパックの詳細については、アセットパックの生成 を参照してください。

Unity が自動的に生成するアセットパックとは別に、自分でカスタムのアセットパックを作成することもできます。これは、アセットパックのコンテンツをコントロールする必要がある場合に便利です。Unityは、作成したカスタムアセットパックを、最終的な Android App Bundle に加えます。カスタムアセットパックの詳細および設定方法については、カスタムアセットパック を参照してください。

生成されたアセットパック

アセットパックには ダウンロードサイズの制限 があります。これを考慮して、Unity は追加アセットのサイズに応じてアセットパックの生成方法を変えます。

  • 追加アセットのストレージ容量が 1 GB 未満の場合、Unity はすべてを 1 つのアセットパックにまとめ、install-time 配信モード にします。カスタムアセットパック を作成しない場合、デバイスがアプリケーションのインストールの一部としてアセットパックをダウンロードし、ユーザーが最初にアプリケーションを起動するときに、すべてのアセットが利用可能になることを意味します。
  • 追加アセットが 1 GB 以上のストレージを必要とする場合、Unity は ストリーミングアセット を 1 つのアセットパックにまとめ、その他の追加アセットを別のアセットパックにまとめます。Unity は、大きい方のアセットパックに install-time 配信モードを設定し、小さい方のアセットパックに fast-follow 配信モードを設定します。

ノート: これらのアセットパックのいずれかが、Google Play ストアで許可されているアップロード制限よりも大きい場合、Unity は警告を表示しますが、ビルドに失敗することはありません。また、Unity はアセットパックのサイズを個別にチェックしていますが、カスタムアセットパックのサイズ検証は行いません。つまり、カスタムアセットパックと Unity が生成したアセットパックの組み合わせが、Google Play Store で許容されるサイズを超えていても、Unity は警告やエラーを表示しません。

Unity が自動生成するアセットパックでは、Unity は 配信モード の変更をサポートしていません。アセットパックの配信モードを変更したい場合は、自身のアセットでカスタムアセットパックを作成してください。

ランタイムのアセットパックの管理

Unity は、ランタイムにアセットパックを管理するために、API を提供しています。これらの API は Google の PlayCore API を使用しているため、PlayCore と同じ制限があり、install-time アセットパックを管理することはできません。PlayCore API を使用するということは、アプリケーションが PlayCore プラグインを必要とするということでもあります。プロジェクトにアセットパック (カスタム アセットパックまたは Unity が生成したアセットパック) がある場合、Unity はアプリケーションのマニフェストに PlayCore の依存関係を自動的に追加します。

アセットパックをダウンロードし、そのアセットにアクセスする方法は、アセットパックの配信モードによって異なります。アセットパックの配信モードは 3 種類あります。

  • install-time: Google Play は、デバイスがアプリケーションをインストールする際に install-time アセットパックを自動的にダウンロードします。Google Play では、これらのアセットパックを基本アプリケーションの一部とみなし、エンドユーザーはアプリケーション全体をアンインストールしない限り、アセットパックをアンインストールすることはできません。PlayCore API は、 install-time アセットパックを処理しません。つまり、 install-time アセットパックの状態を確認したり、ダウンロードを要求したり、削除したりすることはできません。また、これらのアセットパック内のアセットに直接アクセスすることもできません。ただし、Unity が生成した install-time アセットパック内のストリーミングアセットは例外です。ストリーミングアセットにアクセスするには、Application-streamingAssetsPath を使用してストリーミングアセットの場所へのパスを取得し、UnityWebRequest を使用してそのパス内のアセットにアクセスします。カスタムアセットパックを作成した場合、標準のファイル API を使ってその中のアセットにアクセスすることはできません。代わりに、Android の AssetManager API を使用します。
  • fast-follow: Google Play では、アプリケーションをインストールした後、fast-follow アセットパックのダウンロードを自動的に開始します。ただし、アプリケーションの初回起動時に、一部の fast-follow アセットパックが利用できない可能性があります。状況を確認して fast-follow アセットパックをダウンロードするには、以下を参照してください。
  • on-demand: Google Play では、on-demand アセットパックのダウンロードが自動的に行われません。手動でダウンロードを開始する必要があります。その方法については、以下の通りです。

配信モードの詳細については、配信モード を参照してください。

アプリケーションが fast-follow または on-demand アセットパックを使用している場合、アプリケーションがアセットパック内のアセットにアクセスする前に、デバイスがこれらのアセットパックをダウンロードする必要があります。アセットパックの状態を確認し、デバイス上にない場合にダウンロードするには、まず各アセットパックの名前を知る必要があります。Unity が生成したアセットパックの名前を取得するには、AndroidAssetPacks.GetCoreUnityAssetPackNames を呼び出してください。カスタムアセットパック の名前を取得するランタイム API はありません。そのため、自分で管理する必要があります。カスタムアセットパックの名前は、ビルド時にディレクトリ名として設定します。

アセットパックの名前がわかったら、各アセットパックの状態を確認するために、AndroidAssetPacks.GetAssetPackStateAsync にアセットパックの名前を渡して呼び出します。これにより、問い合わせたアセットパックの状態が返されるので、その結果をもとに、アセットパックをダウンロードする必要があるかどうかを判断することができます。Unity が生成したすべてのアセットパックの状態をすばやく照会したい場合は、AndroidAssetPacks.coareUnityAssetPacksDownloaded を使用します。これは、最初のシーン以外をロードしたり、Unity が扱う他のリソースにアクセスしようとする前に、Unity が生成したすべてのアセットパックが利用可能であることを確認できるため便利です。

ダウンロードが必要なアセットパックごとに、AndroidAssetPacks.DownloadAssetPackAsync にアセットパックの名前を渡して呼び出します。アセットパックのダウンロード中は、ダウンロード状態を監視してください。なぜなら、ダウンロードが一時停止したり、失敗したりすることがあるからです。これを行うには 2 つの方法があります。

  • AndroidAssetPacks.DownloadAssetPackAsync が返すDownloadAssetPackAsyncOperation インスタンスを定期的に確認してください。
  • 2 番目のパラメーターとしてコールバックを受け取る AndroidAssetPacks.DownloadAssetPackAsync のバージョンを使用してください。渡すコールバックは、ダウンロードの状態を判断するために使用する AndroidAssetPackInfo をパラメーターとしてとる必要があります。

カスタムアセットパック

特定のアセットパックに含まれる非コードリソースを制御したい場合は、カスタムアセットパックを作成することができます。Unity が生成したアセットパックとは異なり、カスタムアセットパックには配信モードを設定することができます。カスタムアセットパックを作成する場合、Google Play ストアにはアセットパックのサイズと数量の制限があります。制限に関する情報は、ダウンロードサイズの制限 を参照してください。

カスタムアセットパックを作成するには、.androidpack で終わる名前のディレクトリを作成します。このディレクトリは、プロジェクトの Assets ディレクトリの任意の場所、または任意のサブディレクトリに置くことができます。例えば、 MyAssets1 という名前のカスタムアセットパックを作成するには、以下を行います。

  1. アセットパックを作成したいディレクトリに移動します。これは、Assets に直接置いたり、Assets/CustomAssetPacks のようなサブディレクトリに置くこともできます。
  2. 新しいディレクトリを作成して、名前を MyAssets1.androidpack とします。アセットパックにアセットを追加するには、このフォルダー内に配置します。 ノート: Unity は、空のアセットパックはビルドに加えません。また、アセットパックの名前は英文字で始まり、英数字かアンダースコアで構成されていなければなりません。
  3. デフォルトでは、配信モードは on-demand となっているため、配信モードを変更しない場合は、ランタイムに手動でアセットパックをダウンロードする必要があります。この方法については、ランタイムの汗っとパックの管理 を参照してください。
  4. 異なる配信モードを使用するには、カスタムアセットパックのディレクトリ内に build.gradle というファイルを作成します。このファイルに以下の内容を貼り付けます。
apply plugin: 'com.android.asset-pack'
assetPack {
    packName = "MyAssets1"
    dynamicDelivery {
        deliveryType = "fast-follow"
    }
}

これにより、配信モードが fast-follow に設定され、Google Play がアプリケーションをインストールした後にアセットパックを自動的にダウンロードします。このファイルの形式については、アセット配信を統合する を参照してください。

ノート: build.gradle ファイルで指定する packName は、.androidpack 拡張子を付けずに設定したアセットパックのディレクトリ名と一致する必要があります。

APK 拡張ファイル (OBB) のサポート
Android のグラフィックス