Chunkに親子関係を設定し、子ChunkにあるPrimaryAssetをAsyncLoadした場合、子Chunkだけでなく、依存している親Chunkも自動的にダウンロードされると考えてよいでしょうか?
こちらでテストデータを作成して試したところ、自動的に親Chunkがダウンロードされることはなく、子ChunkのPrimaryAssetをAsyncLoadする前に親Chunkを明示的にダウンロードする必要がありました。
ご確認いただけると助かります。
Chunkに親子関係を設定し、子ChunkにあるPrimaryAssetをAsyncLoadした場合、子Chunkだけでなく、依存している親Chunkも自動的にダウンロードされると考えてよいでしょうか?
こちらでテストデータを作成して試したところ、自動的に親Chunkがダウンロードされることはなく、子ChunkのPrimaryAssetをAsyncLoadする前に親Chunkを明示的にダウンロードする必要がありました。
ご確認いただけると助かります。
お世話になっております。
残念ながら、Chunkの親子関係( FChunkDependency
)は各アセットをどのChunkに割り当てるかを管理するデータベースの更新( UAssetManager::UpdateManagementDatabase
)とChunkのManifest作成( FAssetRegistryGenerator::SaveManifests
, FAssetRegistryGenerator::FixupPackageDependenciesForChunks
)にしか使われておらず、実行中のChunkのダウンロード処理においては使用されていません。また、ManifestやアセットデータなどにChunkの親子関係に関する情報は保存されていません。そのため、自動的に親Chunkがダウンロードされる仕組みを作るためには、Chunk作成時に親子関係に関する情報をどこかに埋め込む必要があります。
まず最も手軽なのが、子Chunkを管理するPrimaryAssetLabelのAsset Bundleに親Chunkが管理しているアセットを登録する手かと思います。この対応を入れることで UAssetManager::LoadAssetList
における FindMissingChunkList
のチェックに引っかかり MissingChunks
に親ChunkのIDが入ります。そして、その下にある AcquireChunkList(MissingChunks, ...
で親Chunkのダウンロードが開始されます。ただし、iniファイルによるChunkDependency管理もする必要があることを考慮すると、少し煩雑なワークフローにはなってしまいます(何か自動化する仕組みを入れるべきかもしれません)。
次に、事前にChunk毎のManifestに親Chunkの情報を追加しておき、実行中に子Chunkがダウンロード処理が行われた際に同時に親Chunkのダウンロードを行う手です。この方法であれば上述のようにChunkの親子関係を意識したアセット編集を行う必要がありません。しかし、Manifestに親Chunkの情報の追加処理と、子Chunkのダウンロード時に連鎖的に親Chunkもダウンロードする処理を入れる必要があります。
前者に関しては各ChunkのManifestを生成している FBuildPatchAppManifest
に手を入れる必要があるはずです。 FBuildPatchAppManifest::SerializeToJSON
でManifestへの書き込み処理がありますので参考になるかと思います。
後者に関しては HttpChunkInstaller
に手を入れる必要があるはずです。 FHTTPChunkInstall::BuildChunkFolderName
にてManifestからパラメータを取得する処理がありますので参考になるかと思います。
あまり良い答えを出せず大変申し訳ありませんが、少しでも参考になれば幸いです。
よろしくお願いいたします。
ご回答ありがとうございます!
ダウンロード時は独自で親子関係を管理する必要があるということ、了解しました。
また、対応策に関しても詳しいご説明ありがとうございます、参考にさせていただきます!