見出し画像

【Unity】Addressable Asset Systemの全体像を掴む

Unityでアセット(画像、音、動画、3Dモデル、Prefab)を扱う上で主要な機能であるAddressable Asset Systemが「なにもわからない」状態だったので、全体像を掴むために図解してみました。

画像1

設定がどのように関連しているのか繋がりを把握しやすくするために一枚画像にしてあります。noteに貼り付けると圧縮がかかり文字が識別しにくくなるため、Googleフォトに置いた以下のオリジナルサイズをご覧ください。

オリジナルサイズ (2.6MB)
オリジナルサイズ-スクショなし (1.75MB)

環境

Unity 2019.4.5f1
Addressable Asset System 1.18.15

必要な設定とパターン

詳細項目は省きつつ図は網羅的にしてありますが、使用するパターンによっては考慮する必要がない項目もあります。そこで主なパターンでの使い方について考えてみます。

パターン1:とにかく今までのResourcesのように使いたいんだ!

プラットフォームは1つ(例 : Windows)だけだし、開発用とか本番用とかで分けないし、アプリのサイズも気にしない!とにかく簡単に今までのResourcesのように使いたいという場合は以下のような構成で良いかと思います。

・Profile:1個 (Default)
・Group:1個 (Default Local Group)

Default Local Groupにアセット(画像など)を追加していき、LoadAssetAsync("Addressable Name")でスクリプトからアセットを引っ張ってくることができます。

パターン2:開発用と本番用、プラットフォーム単位で読み込み場所を変えたい

この場合はProfileをそれぞれの用途に応じて作成します。Profileを切り替えることで全てのアセットの読み込み場所をまとめて変更することができます。

・Profile:切り替えたい個数
・Group:1個 (Default Local Group)

パターン3:アセットによって読み込む場所を変えたい

アプリをストアに申請するとき、アプリサイズが大きすぎるとリジェクト対象になる場合があります。そこでアプリのサイズを抑えつつ、アセットはダウンロードにしたいときはこのパターンになります。

・Profile:1個 (Default)
・Group:2個 (Local/Remote) または3個以上

ゲームが進むにつれて必要なアセットを自前のサーバ(Remote)からダウンロードするようにしておけば、最初のアプリインストール時のサイズ(Local)は抑えつつ、必要になったタイミングでアセットを利用することができます。

これによってすぐに使わないデータのダウンロードでユーザーが待たされるといったユーザー体験の質の低下を防ぐことができるようなります。また一度ダウンロードされたアセットはローカルストレージにキャッシュされるため、再び利用するときはスピーディーに読み込まれます。

このパターンの注意点としては、アプリリリース後にコンテンツ(アセット)を新規に追加したい場合はこの方法だけでは対応できないことです。どのアセットがどの場所にあるかはカタログとして事前にアプリに組み込んでおく必要があるため、サーバにアセットを追加してもアプリ側は新しいアセットを認知することができません。

この場合ダウンロードコンテンツ(DLC)を新しく追加するには、アプリとAddressable Asset System (AAS)を再ビルドしてストアに再申請する必要があります。アプリの再ビルドを必要としない新規DLC機能を組み込むには、次のパターン4を使います。

パターン4:新規ダウンロードコンテンツ(DLC)機能を追加したい

Addressable Asset System真骨頂のパターンです。アプリを再ビルドせずに新規コンテンツ(アセット)を読み込ませる場合は、アプリがサーバに追加されたアセットの存在を知る必要があります。

・Profile:1個 (Default)
・Group:2個 (Local/Remote) または3個以上
・Remote Build Catalogの有効化

どのアセットがどの場所にあるかは、カタログファイルで管理しているため、このカタログをリモートサーバから取得できればアプリは新規アセットをダウンロードすることができるようになります。

スクリーンショット 2021-08-22 091815_New

Addressable Asset Systemの大元であるAddressableAssetSettingsのインスペクタから「Build Remote Catalog」にチェックを入れると、ローカルだけでなくリモートサーバに配置するカタログを出力し、アプリにリモートで読み込むように設定することができます。

この状態でアセットをビルドすると/ServerData/[BuildTarget]に、catalog.jsonとcatalog.hashが出力されます。jsonファイルはカタログそのもので、hashファイルはカタログファイルのハッシュ値が記録されています。

このjsonファイルとhashファイルをLoadPathに入力したサーバに配置することで、アプリはこのカタログのハッシュ値を見てカタログが更新されているかを判断します。

その他Tips

Addressables Groupsのグループ名の横に(Default)が付いているグループはオブジェクトのインスペクタにチェックを入れたときに、そのグループに自動的に追加されるようです。

デフォルトに設定したいグループを右クリックしてメニューの「Set as Default」を選択すると、そのグループがデフォルトに設定されます。

スクリーンショット 2021-08-22 095150

スクリーンショット 2021-08-22 095030_New

おわりに

冒頭の図は自身がAddressable Asset Systemを理解するために作成しました。「アセットを読み込む基本機能なのにどうしてこんなに難しいのだろう?」と思っていましたが、図にしてみたり読み込む場所をローカルやリモートで切り替えたい場合などのパターンを考えると必然的な構成であるような気がしてきます。

Addressable Asset Systemではアセットの読み込み場所の切り替え機能のほかに、効率的なメモリ解放機能もあります。ネットの普及と高速化伴うゲーム配信、ソシャゲやDLCの繁栄を考えると、アセット管理としてResourcesだけでは機能としては不十分でUnityが公式でResourcesの利用を非推奨としているのも頷けます。

またAddressable Asset Systemを触っていると頻繁に「Default」という文字が出てくるため、「Defaultって何が?」という気分になったのですが、Unityの基本機能として少ない手順で使えるように「Defaultとして設定してますよ」というUnity社の計らいを僅かながらに感じてしまうのでした。🌱

参考


この記事が気に入ったらサポートをしてみませんか?