予定
理容室で髪を切っている時に「今日はこの後ご予定とかあるんですか?」という質問が一番苦手な休日ニートの皆さんこんにちは。それから髪を洗っている時に何の断りもなく頭のマッサージへ移行するサービスも苦手です。思わず声が出そうになるので
Addressables
Unityで動的にアセットを読み込む場合、Resourcesフォルダにアセットを配置してLoadする実装は随分前から非推奨な方法となっています。
理由としてはResourcesディレクトリ内に配置されたファイルはゲーム起動時に自動的に全てメモリにロードされる為、ゲームの起動が遅くなったり細かなメモリ管理ができなくなるだけでなく、プラットフォームに応じたリソースの配信ができないというデメリットの為ですが、その代替えとなるAssetBundleを利用する方法は少し面倒でソースの修正も必要で、個人的には従来通りResourcesフォルダを利用していました。
とは言え、いつまでもResourcesフォルダを使うわけにもいかないので、次作の開発を始めたのを機にAssetBundleをより使いやすくしたAddressable Asset System(以下、Addressables)を導入することにしました。
このシステムは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に変更します。
- 対象となるアセット(画像やプレハブ)をAddressables Groupに登録する
- AddressablesのPlayModeを「Use Asset Database」に設定する
- 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を使用する場合は、少し複雑な手順と設定を行います。しかし、スクリプトはリモートとローカルで変更する必要がありません(超重要)。
制作現場の規模によってビルド・設定手順は様々異なりますが、単独や少人数での開発では以下のような手順になると思います。
- Addressablesの設定をリモート用に変更する
- Addressables GroupのアセットをビルドしてAssebundleを作成する
- ビルドしたAssebundleをサーバへアップロードする
- AddressablesのLoadPathの設定にサーバのURLを指定する
- 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と同じように使うことができます。
リモートとローカルでスクリプトを分ける必要がない事も大きな利点で、容量制限の厳しいスマホ向けのゲームを開発されている方は導入を検討してもそれだけの価値はあると思います。