原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】今更ながらAddressable Asset Systemを使ってみる

予定

理容室で髪を切っている時に「今日はこの後ご予定とかあるんですか?」という質問が一番苦手な休日ニートの皆さんこんにちは。それから髪を洗っている時に何の断りもなく頭のマッサージへ移行するサービスも苦手です。思わず声が出そうになるので

 

Addressables

Unityで動的にアセットを読み込む場合、Resourcesフォルダにアセットを配置してLoadする実装は随分前から非推奨な方法となっています。

理由としてはResourcesディレクトリ内に配置されたファイルはゲーム起動時に自動的に全てメモリにロードされる為、ゲームの起動が遅くなったり細かなメモリ管理ができなくなるだけでなく、プラットフォームに応じたリソースの配信ができないというデメリットの為ですが、その代替えとなるAssetBundleを利用する方法は少し面倒でソースの修正も必要で、個人的には従来通りResourcesフォルダを利用していました。

とは言え、いつまでもResourcesフォルダを使うわけにもいかないので、次作の開発を始めたのを機にAssetBundleをより使いやすくしたAddressable Asset System(以下、Addressables)を導入することにしました。

docs.unity3d.com

 

このシステムはUnity2019で本リリースされているのでUnity2019以降のバージョンであれば利用することが出来ます。
エディタのメニューから[Window] > [PackageManager]を選択し、パッケージ一覧から「Addressables」を選択してInstallボタンを押します。

 

AddressablesはAssetBundleをグループ単位で管理するシステムなので最初に管理するグループの設定を行います。
メニューの[Window] > [Asset Management] > [Addressables] > [Groups]を選択

表示されたウィンドウの[Create Addressables Settings]ボタンを押します。

ProjectウィンドウのAddressableAssetsDataフォルダの下にAddressable Assets Systemに関する設定ファイルが出力され、「Default Local Group(Default)」というグループが作成されます。
以後、特にリソースを分ける必要が無ければこのDefaultグループにアセットを登録していきます。

 

ローカル(自PC内)での使用

AddressablesをResourcesフォルダ代わりにローカル(自PC内)で使用する場合は、以下の手順の設定を行ってResources.Loadの箇所をAddressables.LoadAssetAsyncに変更します。

  1. 対象となるアセット(画像やプレハブ)をAddressables Groupに登録する
  2. AddressablesのPlayModeを「Use Asset Database」に設定する
  3. Addressables.LoadAssetAsyncでアセットをロードする

 

1.Addressables Groupへの登録

Addressablesをプロジェクトに導入するとImageやPrefabを選択した際、InspectorにAddressableのチェックボックスが表示されるようになります。

Addressables使って動的に読み込みたいアセットに対しては、最初にこのAddressableという項目にチェックします。

チェックすると自動的に選択したアセットがDefaultグループにAddressable欄の名前で登録されますが、ここでは自分で管理しやすい名前に変えて問題ありません

 

メニューの[Window] > [Asset Management] > [Addressables] > [Groups]を選択して表示されるAddressables Groupウィンドウを確認すると、先ほどのアセットが設定した名前で登録されていることが分かります。

 

2.PlayModeの設定

先程のAddressables Groupウィンドウで「Play Mode Script」を押して表示されるリストの中から「Use Asset Database(fastest)」を選択します。

 

3.Addressables.LoadAssetAsyncでロード

ここまでの設定を終えたらスクリプトでAddressables.LoadAssetAsyncにてアセット名を指定してロードすることができます。
ただい、LoadAssetAsyncは非同期処理なのでCompletedイベントで処理をする必要があります。

Completedではなくコルーチンで処理の終了を待つこともできます。

 

上記の実装によりゲームを起動するとAddressablesに登録した画像(傘のアイコン)がロードされ、スプライトの画像が変更されます。

 

リモートでの使用

Addressablesを利用する真の目的はプラットフォーム毎やバージョン毎のリソース管理・配布を簡単にする事です。

そういった場合、ロード対象となるアセット(画像やプレハブ)を一旦、Assebundleという形に変換してサーバに配置、リモートでAssebundleをダウンロードして対象のアセットをロードします。
この為、リモートでAddressablesを使用する場合は、少し複雑な手順と設定を行います。しかし、スクリプトはリモートとローカルで変更する必要がありません(超重要)
制作現場の規模によってビルド・設定手順は様々異なりますが、単独や少人数での開発では以下のような手順になると思います。

  1. Addressablesの設定をリモート用に変更する
  2. Addressables GroupのアセットをビルドしてAssebundleを作成する
  3. ビルドしたAssebundleをサーバへアップロードする
  4. AddressablesのLoadPathの設定にサーバのURLを指定する
  5. Addressables GroupのPlayModeを「Use Existing Build」に変更する

 

1.リモート用に変更

最初に[Window] > [Asset Management] > [Addressables] > [Settings]を選択してBuild&Load Pathsの設定を「Remote」に変更します。

そしてPath PreviewのBuildPath欄の記載を確認しておきます。

 

2.Assebundleを作成 → 3. サーバへアップロード

Addressables Groupウインドウを表示して[Build] > [new Build / Default Script]を選択します。

これによりAssebundleが先程のBuildPathの箇所に作成されます。

ファイルが幾つかありますがいずれも必要な物なので、全てサーバへアップロードします。

 

4.LoadPathにサーバのURLを指定

次に[Window] > [Asset Management] > [Addressables] > [Profiles]からAddressables Profileウィンドウを開き、Remote欄をCustomに変更、RemoteLoadPath欄にサーバのURLを指定します。

 

再度メニューから[Window] > [Asset Management] > [Addressables] > [Settings]を選択してLoadPathがProfileで設定したURLとなっていることを確認します。

 

5.PlayModeを変更

最後に[Window] > [Asset Management] > [Addressables] > [Groups]からAddressables Groupウインドウを表示、「Play Mode Script」を押して「Use Existing Build」を選択します。

 

少々複雑ですが設定を変えるだけでスクリプトを変更することなくアセットをリモートでロードすることが出来ます。
アセットに新しく素材を追加したり、変更した場合はAssebundleのビルドから同じ手順を行う必要があります。Assebundleのビルドに失敗する場合は、一旦、Addressablesの設定をローカルに戻すと良いかもしれません。
(ビルド後はリモートに戻す)

 

最後に

Addressablesは初期設定の煩わしさを超えてしまえば、後はAssebundleのビルドとサーバへのアップロード(リモートの場合)を行うだけで、Resourcesと同じように使うことができます。

リモートとローカルでスクリプトを分ける必要がない事も大きな利点で、容量制限の厳しいスマホ向けのゲームを開発されている方は導入を検討してもそれだけの価値はあると思います。

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。