【Unity】【Addressable】リモートコンテンツカタログによるダウンロードとロードの仕組み

UnityにAddressableアセットシステムのリモートコンテンツカタログによるダウンロードとロードの仕組みについてまとめました。

Unity2019.2.10
Addressable1.3.8

はじめに

この記事ではAddressableのリモートコンテンツカタログによるダウンロードとロードの仕組みについてまとめます。
Addressableの概念や基礎知識についての説明はこの記事では省略しますが、
以下の記事にまとめていますので、必要に応じて参照してください。

light11.hatenadiary.com

コンテンツカタログ?

Addressableアセットシステムはロード対象のアセットに対応するアドレスを指定してダウンロード・ロードを行います。
つまりロード時には、あるアドレスがどのアセットと対応していて、どのAssetBundleに含まれるのかという情報が必要です。
またAssetBundle同士の依存関係の情報も同じように必要です。

Addressableでは、これをコンテンツカタログと呼ばれる仕組みにより解決しています。
ダウンロードコンテンツだけを追加するような場合には、
新しく追加するリソースと一緒に新しいコンテンツカタログをダウンロードすることで依存関係などの情報を取得します。

本記事ではコンテンツカタログによるダウンロードやロードの仕組みをまとめます。

コンテンツカタログを使う流れ

まずコンテンツカタログを生成するためには、AddressableAssetSettingsのBuild Remote Catalogにチェックを入れておきます。

f:id:halya_11:20191124212406p:plain

この状態でAddressableのビルドを行うと、ビルドパスにコンテンツカタログとそのハッシュが生成されます。

f:id:halya_11:20191124212714p:plain

これに依存関係の情報などが記載されています。
また、これとは別にStreamingAssetsCopyにsettings.jsonという名前のjsonファイルが生成されます。

f:id:halya_11:20191124212931p:plain

このjsonファイルには先ほどのコンテンツカタログをどこからダウンロードすればいいかを記載されています。
アプリをビルドする際にこのファイルがStreaming Assetsに含まれ、リモートにあるカタログの場所がわかるようになっています。

また、ダウンロードしたコンテンツカタログはストレージにキャッシュされ、更新があるときにだけダウンロードされます。
その更新判定に、コンテンツカタログとともに生成されていたハッシュ値が使われます。

ダウンロードができてしまえばあとは指定されたアドレスに対応するAssetPathを使ってAssetBundleからアセットをロードするだけです。

プレイヤーバージョンを固定する

さて前節で生成したコンテンツカタログにはファイル名にタイムスタンプが付与されていました。

f:id:halya_11:20191124212714p:plain

前述の通り、このファイル名はsettings.jsonに記載され、それを元にコンテンツカタログをダウンロードするわけですが、
コンテンツカタログの名前がビルドごとにタイプスタンプで変わってしまうようではダウンロードURLが変わってしまい、
アプリを更新せずにダウンロードコンテンツだけ更新することができなくなってしまいます。

そこで、コンテンツカタログの名前を固定します。
固定するには、AddressableAssetSettingsPlayer Version Overrideダウンロードコンテンツのバージョンを入力します。

f:id:halya_11:20191124213628p:plain

これを設定することで、ビルドされるコンテンツカタログにはタイムスタンプではなくこのバージョンの文字列が付与されます。

f:id:halya_11:20191124213736p:plain

そしてこのアプリはこのバージョンのカタログをダウンロードするようになります。
バージョンを変えない限りコンテンツカタログは同じ名前で上書きされるので、ダウンロードコンテンツだけの更新が可能となります。

関連

light11.hatenadiary.com