[UE5]Chunkを活用したAndroidアプリを作ろう!
はじめに
みなさんChunkはご存知ですか?
スマートフォンのゲームを新しく始めると、多くの場合重めの初回ダウンロードが始まりますよね。
Androidの場合、Google Play Storeにはアプリのアップロードサイズ制限があり、(およそ)1GB以上のアプリはストアにアップロードできません。
なので、アプリ起動時に必要なタイトル画面やムービーなどはストアからダウンロードしたときの中に含まれていますが、その後出てくるゲームの中身はまだインストールされていないので、初回のダウンロードを経てようやく完成体になるわけですね。
これをChunkで説明すると、ストアからダウンロードした時のデータはChunk0、アプリ起動後の追加のダウンロードデータはChunk1以降のどれかということになります。
このように割り振られたChunkIDごとに入っているアセットが違い、そのアセットが必要になる場面の前にそのアセットが入っているChunkを端末にインストールしておく必要があります。

めんどくさいだけじゃんと思われるChunkにはいくつかメリットがあり、必要ないアセットはインストールさせないという利点もあります。
例えば多言語対応アセットです。
日本からダウンロードしたアプリに日本語以外のアセットはほとんどの場合必要ないですね。
言語ごとにChunkを分けておけば対応する言語のアセットを取るだけで済むので、無駄な容量を奪うことはなくなり、ダウンロード時間も短縮されます。
(もちろんモバイル以外でも)このようにChunkをうまく扱えればUXを損ねずにいい感じのサービスを提供できるようになります。
まあ、IDの割り振りと管理が面倒なんですけどね。
今回はChunkを使って簡単なAndroidアプリを作成してみようと思います。
開発環境
- Windows11
- UE5.3.2(ソースコードビルド)
- Visual Studio 2022
- Android Studio Flamingo 2022.2.1 Patch 2
- Xperia 1 Ⅱ
※注意※
本記事ではContent Delivery Network(CDN)サーバーにAWS CloudFront、オリジンサーバーにAWS S3を使います。
真似すると料金が発生するので、自己責任でお願いします。
あと、あくまでテストなのでセキュリティの設定も最低限しかしていません。
※AWS CloudFront・・・ユーザーにChunkを配信してくれるやーつ
※AWS S3・・・Chunkを置いておくとこ
手順
1. CDNサーバーの設定
Chunkを保管しておくS3バケットを作成します。
バケット名はpate-chunk-testです。

CloudFrontから新規ディストリビューションを作成し、先ほど作成したバケットをオリジンに設定し、アクセス方法はLegacy access identitiesにし、OAIは新しく作成します。

WAFはなしで。

その他はデフォルトの設定のままで、ディストリビューションの作成を完了します。
CloudFrontでオリジンに指定したS3のバケットポリシーに自動で設定されます。

このバケットポリシーのおかげで、先ほど新規作成したCloudFrontのOAIを通したS3へのアクセスのみを許可するようになります。
ただ、このポリシーでは「明示的にCloudFront経由のアクセスのみを許可」しているだけであって、他のアクセスを拒否しているわけではありませんので、しっかり設定するなら"Effect":"Deny"も設定した方が良いですね。
ディストリビューションのURLが後で必要になるので、コピーしておきます。

2. プロジェクトの設定とChunkの振り分け
UEのThirdPersonTemplateを起動します。
今回は、ThirdPersonMapをパーシスタントレベルとし、そこに2つのレベルをサブレベルとしてくっつけます。
この3つのレベルをChunkで振り分け、Chunk0のTitleマップにてChunk1以降を取得しようと思います。
構成は次の画像の通りです。

まずはSubLevel1とSubLevel2にオブジェクトを配置します。
配置するのは渾身の力作である私の似顔絵とおなじみのきつねアイコンです。
Planeにマテリアルを貼り付けただけです。

SubLevel1

SubLevel2
上記2つをThirdPersonTemplateのサブレベルにします。
Streaming MethodはAlways Loadedにします。

PrimaryAssetLabel(PAL)をつかってChunkIDを振り分けていきます。
Miscellaneous > DataAssetからPrimaryAssetLabelを選択します。

3つ作成し、それぞれ設定します。

PAL_Chunk1の設定

PAL_Chunk2の設定

PAL_Chunk3の設定
PrimaryAssetLabelの設定項目は次の通りです。
| 項目 | 説明 |
|---|---|
| Priority | 他のPAL等によってChunk IDの割り振りに競合が発生した場合の優先順位。0が一番優先される。 |
| Apply Recursively | 管理対象となったアセットが参照しているアセット(ハード参照もソフト参照も)を管理対象にするかどうか 。 |
| Chunk ID | Chunk IDを何番にするか。 |
| Cook Rule | どのConfigurationのときにCookするかを指定できる。 |
| Label Assets in My Directory | PALが配置されているフォルダとサブフォルダを含む全てのアセットを管理対象にするかどうか。 |
| Is Runtime Label | 実行中に使えるようにするかどうか。基本的にTrueにする。 |
| Explicit Assets | 特定のアセットを管理対象に指定できる。 |
| Explicit Blueprints | 特定のBlueprintを管理対象に指定できる。 |
| Asset Collection | Collectionを1つだけ管理対象にできる。 |
3. Chunkダウンロード処理作成
Widgetを作成し、ボタンを押すとレベルの移動、Chunkのダウンロードを行えるようにします。


先ほどコピーしたCloudFrontのURLは、Request ContentノードのRemote Manifest URLと、Cloud URLで必要になります。
これに関しては、パッケージ化で出力されるChunkを見ながら解説しますので、次に進みます。



4. パッケージ化してChunkを配置
Chunkを作成するための設定をします。
Http Chunk Install Data Directoryで指定したパスにChunkが出力されます。

Androidの設定はChunk0のデータをapkに全て含めるのと、aabはいらないのでfalseにします。

パッケージ化が終わると、先ほど指定したパスにAndroid用のChunkができています。
中身の構成は、
- Android_ASTC
- CloudDir
- ManifestDir
- release1(
Http Chunk Install Data Versionで指定した名前)
となっており、Request Contentノードの引数にはそれぞれ以下を入力しなければなりません。

S3にはChunkInstallフォルダにあるAndroid_ASTCをそのままドラッグアンドドロップでアップロードしましょう。

これで準備は完了です。
5. 動作確認
PCとAndroidをUSBデバッグON状態で接続した後、パッケージ化した出力先にあるInstall_{プロジェクト名}-arm64.batを実行したらアプリがインストールされます。
まずは何もダウンロードせずThirdPersonMapを押してみましょう。
まだThirdPersonMapが入っているChunk1を取っていないので遷移できないはずです。
次に、Chunk1を押し、Mount Successが表示されたのを確認してからThirdPersonMapを押してみましょう。
ThirdPersonMapには遷移できましたが、サブレベルはまだ取得していないので何もありません。

ThirdPersonMapにいる状態でChunkをとっても更新されないので、一度Titleへ戻ります。
その後、Chunk2を押し、Mount Successが表示されたのを確認してからThirdPersonMapを押してみましょう。
サブレベル2(きつねのテクスチャの方)をまだ取っていないので、似顔絵しか表示されません。

同様にChunk3もやってみると、きつねのテクスチャも表示されます。

まとめ
スマートフォンの容量は年々大きくなっていますが、こちらが提供するコンテンツの質も上がり、1つのアプリが容量を食う割合が増えてきているように感じます。
そんなときこそ無駄なコンテンツを省き、必要な人に必要なコンテンツを届けられるよう、Chunkの仕組みをうまく活用していきたいですね。
Discussion