赤兎ラボ

コーディングからバージョン管理、業務効率化までをまとめます。

Unity Addressables

前提

以下の点を理解していない場合は、Addressableを導入するには早いかもしれません。
> Resources.Loadを使ったことがあること
> Coroutine等、非同期処理について理解していること

また、導入のための手順が比較的多いので、解説用の画像は以後追加できればしたいと考えています。
文字だけで読める勇者さん向けの記事になります。

Version
> Unity 2019.2.14f
> Addressable 1.7.5

Unity Addressablesとは

ResourcesやAssetBundleとして実装されていたバラバラのリソース管理システムが統合されたようなアセット管理システム。
非同期ロードをベースに考えられている。
ローカル環境でのリソースロードからリモート環境でのロードまで柔軟に変化させることができる。
リモートでのダウンロードは、一度ロードされたアセットは端末上に保管され、次回実行時はダウンロードせずに済む。
prefab等の他アセットへの参照を認識して保存してくれるため、AssetBundleのように参照切れが起こりにくい。

導入方法

PackageManagerからAddressableをインポートします。

既存リソースの整理

既存リソースを選択すると、インスペクタにAddressableのチェックが名前の下辺りに出ていると思います。
これにチェックを入れることでAddressable対応します。
チェックを入れると、チェックボックスの隣にパスが表示されると思います。これをAddressableNameと言います。
AddressableNameはAddressableで取得するために使う文字列です。
AddressableNameは編集が出来ます。これによって元のリソースの名前を変えることなく、リソースをロードすることができます。
デザイナーさんに命名規則を強制しなくて済みますね。

Addressableに登録されているリソースは
Window > AssetManagement > Addressables > Groups から確認ができます。
ここで各アセットにLabelを設定することができます。
Labelを設定しておくことで、一括でアセットをダウンロードしたりすることができます。

Window > AssetManagement > Addressables > Groups のdefaultGroup等の各グループを右クリックすると
GroupSettingsを開くことができます。

f:id:RedRabbitNet:20200420162455p:plain

Content Packing & Loading > Advanced Options > BundleMode を PackTogetherByLabelにしておきます。
ここを変更すると、AddressablesをBuildした際に生成される.bundleファイルが分割されます。
これを行うことで、Label単位でGetDownLoadSizeAsyncを呼び出した時にちゃんとダウンロードサイズが表示されます。
ここが設定されていないとダウンロードサイズが正確に表示されません。
エラーも表示されず、容量が0と出るだけなので既にロードが終わっているのか区別がつきません。
この仕様はいつか改善されるはずだと信じています。

Addressable Build

Window > AssetManagement > Addressables > Groups からBuildができます。

f:id:RedRabbitNet:20200420161506p:plain
Addressableにリソースを追加したあとはこれを行うことで、リソースとして認識されるようになります。
また、このビルドによって生成されたファイルをネットワークサーバ上にアップロードすることで
実行ファイルからリソースをサーバに移すことができます。
詳しくはリモートの設定について調べましょう。

f:id:RedRabbitNet:20200420162039p:plain
PlayModeScript等を設定する必要があります。

リソースの保存場所の指定は Window > AssetManagement > Addressables > Profileから設定することができます。
パスにはAsset以下の相対アドレスの他、httpRqeuestの形式で指定できます。

Window > AssetManagement > Addressables > Settings でProfileやリモートの指定ができます。
Catalog > BuildPath, LoadPath が想定通り表示されているか確認しておきましょう。
また、Catalog > Player Version OverrideでAddressableのビルドバージョンが指定できます。
この値は設定しておかないと、ビルドごとに書き換わってしまうため注意が必要です。

プログラム側

書き方がいくつかありますが、今回はAssetReferenceによるロード方法は省きます。
また、ロードと同時にInstantiateする関数もありますが、ほぼ同様なので省きます。

1. Coroutine内で同期待ちをする方法
yield return によって待っているので、コルーチン内に書く必要があります。
また、同様の記述をasync/waitでも実装できます。
var loadAddressable = Addressables.LoadAssesAsync("AddressableName");
yield return loadAddressable;
var gameObject = Instantiate(loadAddressable.Result);

2. 同期処理内でコールバックを設定する方法
あくまでコールバックを設定しているだけなので、この時点でロードが完了してないことには注意。
Addressables.LoadAssesAsync("AddressableName").Completed += op => Debug.Log(op.Result);