Google Play Asset Delivery (Google PAD) は、デバイスにアプリケーションをインストールした後でアセット パックを配信する Google Play ストアのソリューションです。このソリューションは Android App Bundle 配布形式と一緒に使用することを前提にしています。App Bundle がカスタマイズ済みの .apk をエンド ユーザーに配布して、初期インストールでコードやバイナリの処理するのに対して、Play Asset Delivery システムは、モデル、テクスチャ、サウンド、シェーダ、その他の大きなアセット ファイルを .apk とは別に提供します。この機能により Google Play で配布されるアプリは、必要に応じてコンテンツを配信することでコンテンツが占めるスペースを管理できます。
Google Play Asset Delivery の一般情報については、https://android-developers.googleblog.com/2020/06/introducing-google-play-asset-delivery.html にある Android 公式ドキュメントを参照してください。
Unreal Engine 4.25 以降はプラグインで Google PAD 統合を提供しており、このシステムを作成したプロジェクトに簡単に実装することが可能です。このプラグインが提供する関数ライブラリにより、ダウンロードを管理して Play Asset Delivery システムから情報をリクエストする、呼び出しを利用できます。また、UGooglePADFunctionLibrary
は C++ と Blueprint の両方で使用できます。
Android App Bundle の内容に関する詳細は「Android プロジェクトのパッケージ化」を参照してください。
Google PAD プラグインを有効化する
Google PAD プラグインは Unreal Editor の [Plugins (プラグイン)] ウィンドウの [Android] セクションから利用できます。これは Unreal Engine 4.25.0 以降ではデフォルトで有効です。Google PAD を使用するには、パッケージ化の形式として Android App Bundles を使用する必要があります。

このプラグインを完全に有効化するには [Project Settings (プロジェクト設定)] を開いて [Plugins (プラグイン)] > [GooglePAD] > [Packaging] の順に移動します。[Enable Plugin] チェックボックスをクリックすると、Android プロジェクトの起動時にこのモジュールが使用可能になります。

インストール時 アセットに Google PAD を使用する場合は、[Platforms (プラットフォーム)] > [Android] > [APK Packaging] の順に移動して、[Package Data inside APK (APK 内のゲーム データをパッケージ化)] を無効にする必要もあります。メインの .obb ファイルはその後インストール時アセット パックとして自動的に供給されます。
クリックして画像を拡大します
アセット パックを作成する
Google PAD の Asset packs は Android App Bundle ビルド内にパッケージ化され、アップロード時に Google Play Store によって管理されます。このセクションではご使用の App Bundle に含むアセット パックのパッケージ化および整理方法について説明します。
アセットパックの配信モード
チャンク とは外部アセットを管理するための Unreal Engine の形式です。チャンク 0 はゲームの基本インストールを表し、その他すべてのチャンクはゲームのメイン インストール外のアセットを含む .pak ファイルです。
Google PAD を使用するには、ゲームのアセットをチャンクにグループ化し、これらのチャンクをアセット パックにグループかしなければなりません。使用する配信モードに基づいてGoogle Play Asset Delivery は以下のアセットパックの配信モードをサポートします。
配信モード | ファイル サイズの制限 (アセットパックごと) | 説明 |
---|---|---|
Install-Time | 1 GB | インストール時に配信されるアセットパック。プロジェクトのメイン .obb はこのアセットパックに自動的にバンドルされます。 |
Fast-Follow | 512 MB | アプリケーションのインストール後に自動的にダウンロードされるアセットパック。これをダウンロードするためにアプリケーションを開く必要はありません。Fast-Follow アセットパックは 1 プロジェクトにつき 1 つです。 |
On-Demand | 512 MB | アプリケーションが実行するとダウンロードされるアセットパックです。 |
アプリケーションにつき最大 50 までアセットパックを作ることができます。1 プロジェクトにつき Install-Time アセットパックと Fast-Follow アセットパックはそれぞれ 1 つしか作成できませんが、On-Demand アセットパックは 50 までであれば好きなだけ作成することができます。
チャンクを作成する
Project Settings (プロジェクト設定)] をから [Project] > [Packaging] を開いて [Generate Chunks (チャンクを作成する)] が有効であることを確認します。

アセット マネージャ または プライマリ アセット ラベル を使ってチャンク内でアセットを整理することができます。
コンテンツ ブラウザで右クリックして [Miscellaneous (その他)] > [Data Asset (データ アセット)] をクリックしてプライマリ アセットを作成します。
クリックして画像を拡大
データ アセット クラス を選択するプロンプトが表示されます。[PrimaryAssetLabel] を選択して [Select (選択)] をクリックします。
クリックして画像を拡大
新しいプライマリ アセット ラベルに名前を付けます。情報を編集するためにダブルクリックします。
クリックして画像を拡大
同じフォルダ内のすべてのアセットをこのアセット ラベルに属すると指定するために [Label Assets in my Directory] を有効にします。このラベルに属するアセットが属するチャンクを指定するために、Chunk ID に 0 より大きい値を設定します。Explicit Assets リストを使ってアセット ラベルにアセットを直接追加することもできます。
アセット マネージャは [Project Settings (プロジェクト設定)] の [Game] > [Asset Manager] にあります。
クリックして画像を拡大
ここで、プロジェクトがアセットをプロシージャルにチャンクにブループ化するために使用するルールを指定することができます。詳しくは「クックとチャンキング」を参照してください。
特定のチャンクに属するアセットを指定すると、プロジェクトを パッケージ化 することでチャンクが .pak ファイルで出力されます。このファイルは「Saved\StagedBuilds[PlatformName][ProjectName]\Content\Paks
」にあります。
クリックして画像を拡大
App Bundle Build にチャンクをインクルードする
Play Asset Delivery の各配信モードでは、App Bundles にチャンクを取り込むための要求事項が異なります。
Install-Time アセットの場合、何も変更する必要はありません。
Fast-Follow アセット、または On-Demand アセットの場合、インクルードする .pak ファイルを選択して、それをプロジェクトの「Build/Android/gradle/assetpacks
」に移動します。配信モードはそれぞれ異なるサブフォルダを持ちます。
-
Fast-Follow アセットパックの場所は「
Build/Android/gradle/assetpacks/fast-follow/[assetpackname]/src/main/assets
」です。 -
On-Demand アセットパックの場所は「
Build/Android/gradle/assetpacks/on-demand/[assetpackname]/src/main/assets
」です。
をチャンクがバンドルされるアセットパック名に [assetpackname] を置き換えます。異なる .pak ファイルのセットで複数の異なる名前のついたアセットパックを作成することができます。ただし、アセットパックの名前は一意でなければなりません。また、fast-follow と on-demand 間での再利用はできません。この名前は API でアセットパックをクエリする際に使用する名前になります。
最後に、以下のコードを含むアセットパック フォルダに build.gradle ファイルを追加する必要があります。
apply plugin: 'com.android.asset-pack'
def fileparts = projectDir.absolutePath.replaceAll('\\\\', '/').tokenize('/')
def assetPackName = fileparts[fileparts.size()-1]
def assetPackType = fileparts[fileparts.size()-2]
assetPack {
packName = assetPackName
dynamicDelivery {
deliveryType = assetPackType
instantDeliveryType = assetPackType
}
}
これらの要求事項を満たした後に、プロジェクトを app buncle として再度パッケージ化すると、ビルド内にこれらのアセットパックがそれぞれインクルードされます。App Bundle を Google Play Store にアップロードする際に、Google PAD API を使ってアセットパックをダウンロードすることができます。
このワークフローは Unreal Engine 4.26 で効率的に再編されます。
OBB ファイルからチャンクを取り除く
デフォルトでは、.pak ファイルはプロジェクトと一緒に生成される OBB ファイルに含まれています。それらを除外するには、 DefaultEngine.ini
ファイルを開き、Android ランタイム設定の OBB フィルターを使用してフィルターする必要があります。
[/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]
+ObbFilters="-*pakchunk1*"
+ObbFilters="-*pakchunk2*"
+ObbFilters="-*pakchunk3*"
+ObbFilters="-*pakchunk4*"
+ObbFilters="-*pakchunk5*"
+ObbFilters="-*pakchunk6*"
+ObbFilters="-*pakchunk7*"
+ObbFilters="-*pakchunk8*"
+ObbFilters="-*pakchunk9*"
上記の例では、OBB フィルターは、提供されたテキストのいずれかを含むすべての .pak ファイルをキャッチします。たとえば、 + ObbFilters ="-* pakchunk1 * "
は、名前に「pakchunk1」が含まれているすべての pak ファイルを省略します。
API リファレンス
次のセクションでは、Google PAD 関数ライブラリで利用できる関数と、その使用方法を詳しく説明します。
リクエストとエラー ハンドリング
Google PAD 関数ライブラリのリクエストはすべて EGooglePADErrorCode
を返し、これは操作が成功したかどうかを表します。そして失敗した場合は、リクエストを完了できなかった特定のエラーを示します。発生する可能性があるエラー コードを以下に示します。
EGooglePADErrorCode | 説明 |
---|---|
AssetPack_NO_ERROR |
このリクエストにエラーはありません。通常どおりリクエストの情報で続行します。 |
AssetPack_APP_UNAVAILABLE |
リクエストしたアプリは利用できません。 |
AssetPack_UNAVAILABLE |
このアプリの現在のバージョンではリクエストしたアセット パックを利用できません。 |
AssetPack_INVALID_REQUEST |
このリクエストは無効です。 |
AssetPack_DOWNLOAD_NOT_FOUND |
リクエストされたダウンロードが見つかりません。 |
AssetPack_API_NOT_AVAILABLE |
この Asset Pack API は使用できません。 |
AssetPack_NETWORK_ERROR |
タイムアウトやその他のネットワーク エラーにより、アセット パックの詳細を取得できません。 |
AssetPack_ACCESS_DENIED |
現在のデバイスの状態ではダウンロードが許可されていません。ユーザーが Google アカウントにサインインして可能性があります。 |
AssetPack_INSUFFICIENT_STORAGE |
ストレージ容量が足りないためアセット パックをダウンロードできません。 |
AssetPack_PLAY_STORE_NOT_FOUND |
このデバイスに Play ストア アプリがインストールされていないか、公式のバージョンではありません。 |
AssetPack_NETWORK_UNRESTRICTED |
Wi-Fi を必要とするアセット パックがない場合に ShowCellularDataConfirmation を呼び出すと返されます。この場合はユーザーの確認を待たずにダウンロードを続行できます。 |
AssetPack_INTERNAL_ERROR |
アセット パックのダウンロード中に不明なエラーが発生しました。 |
AssetPack_INITIALIZATION_NEEDED |
まだ AssetPackManager_init を呼び出していないため、API もまだ有効化されていません。 |
AssetPack_INITIALIZATION_FAILED |
Asset Pack API の初期化でエラーが発生しました。 |
この戻り値以外にも、リクエスト関数には必要な情報を提供する出力変数があります。結果が AssetPack_NO_ERROR
の場合は、通常どおり提供された情報で続行できます。それ以外の場合は、フロー制御を使用して提供されたエラー コードに適切に対処する必要があります。
ダウンロードしたファイルの場所を取得する
関数 GetAssetPackLocation
は、ダウンロードしたアセット パックの場所を取得して、関連する情報とともにローカルにキャッシュします。そのアセットが利用可能なときは、キャッシュした情報へのアクセスに必要に応じて使用する整数のハンドルを出力します。
GetAssetsPath
を呼び出して場所ハンドルを提供すると、必要なアセット パックのアセット パスを含む文字列を出力します。また、GetStorageMethod
は EGooglePADStorageMethod
を出力し、これはアセット パックをユーザーのデバイスにストアした方法を示します。アセットのパスとストア方法を把握したら、適切な呼び出しを使用してそのアセットを利用できます。
可能なストア方法を以下に示します。
EGooglePADStorageMethod | 説明 |
---|---|
AssetPack_STORAGE_FILES |
アセットパックは個々のアセット ファイルを含むフォルダにアンパックされます。標準のファイル API でこうしたアセットにアクセスできます。 |
AssetPack_STORAGE_APK |
アセットパックは、アセット ファイルがパックされた APK としてインストールされます。 |
AssetPack_STORAGE_UNKNOWN |
アセット パックに関する情報を利用できません。エラーが発生した可能性があります。 |
AssetPack_STORAGE_NOT_INSTALLED |
アセット パックがインストールされていないため使用できません。 |
上記の情報が必要なくなったら、場所ハンドルを ReleaseAssetPackLocation
に渡してキャッシュした場所の情報を解放する必要があります。
アセット パックに関する情報をリクエストする
RequestInfo はダウンロードを開始する上で必須ではありませんが、リモートのアセット パックが有効かどうかの判断に利用できます。
ダウンロードをリクエストまたはキャンセルする
関数 RequestDownload
は、ダウンロードするアセット パック名を表す文字列 TArray
を受け取り、リモート サービスにリクエストを送信して対象のアセット パックのダウンロードを開始します。RequestDownload
がエラーを示しない場合は、アセット パックをダウンロードして非同期にバックグラウンドでアプリに転送します。
これは非同期の機能なので、RequestDownload
関数は、リクエストが成功したかどうかを表すエラー コードを除いて、ダウンロードするアセット パックについて情報を返しません。ダウンロードの現在のステータスを確認するには、以下の「ダウンロードのステータスを監視する」セクションに詳述している機能を使用する必要があります。その後ダウンロードが完了したら、GetAssetPackLocation
を使用してアセット パック自体を利用します。
また、関数 CancelDownload
はアセット パック名のリストを使用して、指定したアセット パックのダウンロードをキャンセルします。
携帯電話データ通信のステータスを取得する
関数 ShowCellularDataConfirmation
は、携帯電話ネットワークを使用してデータをダウンロードするかどうかをユーザーに確認します。この確認を既に行っている場合は、GetShowCellularDataConfirmationStatus を使用してユーザーがダウンロードを承認しているかどうかを示す EGooglePADCellularDataConfirmStatus
を取得できます。
この結果が AssetPack_CONFIRM_UNKNOWN
や AssetPack_CONFIRM_PENDING
の場合はまだユーザーが承認していないことを表し、アプリケーションは承認されるまで待つ必要があります。
この結果が AssetPack_CONFIRM_USER_CANCELLED
の場合はユーザーが携帯電話データ通信の使用を許可していないことを表し、この時点でダウンロードしてはいけません。
この結果が AssetPack_CONFIRM_USER_APPROVED
の場合は、ユーザーが携帯電話データ通信の使用を明示的に承認しているのでダウンロードを続行できます。さらに、この関数が AssetPack_NETWORK_UNRESTRICTED
の結果で EGooglePADErrorCode
を返す場合は、ユーザーが Wi-Fi ネットワークを利用できるため携帯電話データ通信を使用する必要がなく、さらにこの機能を確認せずにダウンロードできます。
ダウンロードのステータスを監視する
GetDownloadState
はアセット パックのダウンロード ステータスをローカルにキャッシュして、このキャッシュ済み情報にアクセスするためのダウンロード ハンドルを返します。この関数は、ダウンロードするアセット パック名を受け取り、そのハンドルを整数として出力します。このダウンロード ハンドルをキャッシュしておくことでダウンロードを引き続き監視できます。そうしない場合はダウンロード ハンドルの再取得が必要です。
有効なダウンロード ハンドルを使用して GetDownloadStatus
を呼び出すことで、必要なアセット パックのステータスを EGooglePADDownloadStatus
として取得できます。この列挙型はダウンロードのステータスであり、以下に示す可能な状態のいずれかを表します。
EGooglePADDownloadStatus | 説明 |
---|---|
AssetPack_UNKNOWN |
このアセット パックに関する情報を現在取得できません。 |
AssetPack_DOWNLOAD_PENDING |
アセット パックをダウンロードする非同期リクエストは送信済ですが、現在保留中です。 |
AssetPack_DOWNLOADING |
現在アセット パックのダウンロード中です。 |
AssetPack_TRANSFERRING |
アセット パックをアプリに転送中です。 |
AssetPack_DOWNLOAD_COMPLETED |
ダウンロードと転送が両方完了したので、アセットをアプリから利用できます。 |
AssetPack_DOWNLOAD_FAILED |
アセット パックのダウンロード リクエストに失敗しました。 |
AssetPack_DOWNLOAD_CANCELED |
アセット パックをダウンロードするリクエストがキャンセルされました。 |
AssetPack_WAITING_FOR_WIFI |
アセット パックのダウンロードは Wi-Fi 転送を待機しています。 |
AssetPack_NOT_INSTALLED |
このアセット パックは現在インストールされていません。 |
AssetPack_INFO_FAILED |
このアセット パックに関する情報のリクエストに失敗しました。 |
AssetPack_REMOVAL_PENDING |
このアセット パックを削除する非同期リクエストは送信済みですが、現在保留中です。 |
AssetPack_REMOVAL_FAILED |
このアセット パックを削除する非同期リクエストに失敗しました。 |
ダウンロード ステータスのハンドルとともに GetBytesDownloaded
を呼び出すことで、ユーザーのデバイスに現在ダウンロード済みのバイト数を取得できます。一方、GetTotalBytesToDownload
はダウンロードする対象の合計サイズを返します。
ダウンロードのステータス情報が必要なくなったら ReleaseDownloadState
を呼び出してハンドルを提供し、メモリからキャッシュ済みのダウンロード情報を解放する必要があります。
アセット パックを削除する
関数 RequestRemoval
にアセット パック名を渡すことで、この指定したアセット パックをユーザーのデバイスから非同期で削除します。このアセット パックを削除するステータスは上記の GetDownloadStatus
で監視できます。
推奨する実装方法
Google PAD API の実装は、ダウンロードの状態によって異なるサイクルとしてモデル化できます。
ステータス | 説明 |
---|---|
Accessing Asset Pack |
|
Initiating Download |
|
Checking for Cellular Data Confirmation |
|
Monitoring Download Status |
|
カスタムの GameState クラスでソリューションを実装すると、シーンやゲーム モードを変更してもダウンロードを引き続き追跡できます。他にも、起動時にロードするフロントエンド ゲーム モードにソリューションを実装して、ゲームの開始前に必要なパッチや更新を実行することが可能です。なお、ソリューションの正確な詳細はアセットを更新するプロジェクト固有のニーズにより異なります。