AsyncLoadPrimaryAssetとHttpChunkInstallerまわりの仕様を正しく理解できていないので確認させてください。
- AsyncLoadPrimaryAssetは引数にLoadするPrimaryAssetLabelパスを指定する必要があり
- AsyncLoadPrimaryAssetは内部で、PrimaryAssetLabelのデータを参照して、必要なChunkIDを取得
- 取得したIDのChunkがローカルに存在しない場合、HttpChunkInstallerによるダウンロードをおこなう
そのため、PrimaryAssetLabelはあらかじめローカルに存在する必要があることになると理解しています。
また、PrimaryAssetLabelすらローカルに存在しない場合は、AcquireChunkListにChunkIDを直接指定して、自分でChunkのダウンロードをおこなう必要がある・・・という理解で正しいでしょうか。
DLC関連のドキュメントやコードを色々確認しているのですが、まだ理解が浅く基本的な質問になってしまい恐縮ですが、ご確認いただけると助かります。
すみません、ちょっと説明不足でしたので補足します。
今回の件は、モバイル環境で、HttpChunkInstallで行っているChunkの自動ダウンロードを無効にする前提で考えています。
iOSではリソースのダウンロード前にユーザーへの通知が必要ですので、HttpChunkInstallで自動ダウンロードを行わないように変更したうえで、アセット読み込む段階で、そのアセットが必要とするChunkを判別し、DL容量を計算したうえでユーザーに提示後、Chunkのダウンロードをおこなう、という想定です。
カンタンなサンプルを作成して挙動を確認しました。
- Chunk1にMap1を指定して、アプリビルド+ChunkInstallをビルド
- ↑の後に、Chunk2にMap2を指定してChunkInstallをビルド
- 最終的なChunkInstallをCDNにアップロード
以上の 状態で、1.で作成したアプリで動作確認をした結果、
- AsyncLoadPrimaryAsset+LoadLevelをおこなった場合
→ Map1は読み込み可能、Map2は読み込み不可能
- AcquireChunkList + AsyncLoadPrimaryAsset+LoadLevelをおこなった場合
→ Map2も読み込み可能
以上より、最初に書いた推定の通りの挙動となりました。
これに関連する記述はドキュメントには見つけられませんでしたが、推定は正しいと考えてよいでしょうか?(=アプリ作成後にコンテンツを追加した場合は、明示的にChunkをダウンロードする必要がある)
お世話になっております。
回答が遅くなり申し訳ありません。
ご質問にある通り、アプリ作成後にコンテンツを追加した場合はChunkをダウンロードする必要があります。そして、そのChunkのダウンロードはAcquireChunkListで明示的に行うか、プロジェクト設定 / Asset Managerにある「ShouldAcquireMissingChunksOnLoad」を有効にした状態でAssetManagerによるロードを行うかのどちらかを選択素rことになります。 UAssetManager::LoadAssetList
における bShouldAcquireMissingChunksOnLoad
を使った条件分岐などの実装が参考になるはずです。一度ご確認いただけますと幸いです。
よろしくお願いいたします。
回答ありがとうございます!
ShouldAcquireMissingChunksOnLoadは有効にしているのですが、それでもアプリ作成後にChunkした場合はManifestの情報だけでは(アプリビルド当時に存在しなかった)アセットのパスから必要なチャンクを特定することはできないようですね。
チャンクを事前にダウンロードすればセットが読み込めるのは、実際に確認できたので、そちらで対応したいと思います。
お世話になっております。
アプリ作成後にChunkした場合はManifestの情報だけでは(アプリビルド当時に存在しなかった)アセットのパスから必要なチャンクを特定することはできないようですね。
残念ながらそうなります。アセットパスからのChunk特定にはアプリビルド時にChunk0に生成されれるAsset Registryの情報が必要になるためです。
お手数をおかけして申し訳ありませんが、チャンクの手動DLでご対応頂ますようお願いいたします。
よろしくお願いいたします。