【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

新しくビルドした際にはこのファイル名は新しいタイムスタンプで更新されます。
またダウンロードリソースのみをビルド(Update a Previous Build)した時にはこれと同じ名前でコンテンツカタログが生成されます。
基本的にはこの仕組みに則れば問題ありませんが、付与される文字列を任意のアプリバージョンに固定することもできます。

これを行うには、AddressableAssetSettingsPlayer Version Overrideダウンロードコンテンツのバージョンを入力します。

f:id:halya_11:20191124213628p:plain

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

f:id:halya_11:20191124213736p:plain

そしてこのアプリはこのバージョンのカタログをダウンロードするようになります。

関連

light11.hatenadiary.com