【Unity】Addresable Asset Systemを使ってみる
本記事で扱うUnityのバージョンは「Unity2018.3.7f1」です。
Addresable Asset Systemのバージョンは「Version 0.6.7 Preview」です。
今までの複雑だったAssetBundleのビルドやロードをよりシンプルにしたAsset管理システム
とにかくコードを書く量が少なく済み、環境によって書き換えたり、依存関係を気にすることがなくなる
導入編
まだPreview版なので、Unity2018.2以降のPackageManagerよりインストール可能です。
インストール後、UnityのWindow→Asset Management→Addresable Assetsを開きます。
はじめは設定が必要なので、
Create Addresables Settingを選択して、
設定ファイルを作成します。
作成後、このようなウインドウが開かれます。
ここで主にAssetを管理します。
Assetの登録
登録したいAssetをそのままAddresablesのウインドウに、ドラッグアンドドロップするか、
AssetのInspectorのAddresableにチェックを入れると登録されます。
Assetを選択してドラッグアンドドロップ
もしくはチェックマークを入れる
登録されるとこのようになります。
Addresableで使用するAsset名が長いのでシンプルにします。
対象のAssetを選択して、Simplify Entry Namesを選択。
Addresableで管理したいディレクトリを丸ごと持ってくるということは現状ではできないので、
今後追加されることを祈るか、自前で実装という感じですね。
一応これで準備は整いました。
Addresableのモード
Addresableの動作モードを説明します。
Play Mode Scriptを選択すると、各モードが選択できます。
・Fast
パッキングせずに、ファイルを直接ロード
・Virtual
パッキングせずに、実際にパッキングしたときの動作をシミュレート
・Packed
パッキングして、AssetBundleからロード
Assetの読み込み
実際にコードを書いていきます。
Addressables.LoadAsset<Sprite>(assetName) .Completed += (op) => { img.sprite = op.Result; };
非同期で読み込みます。
渡す引数としては、「Asset名(assetName)」の他に、
「AssetReference」というのも渡せます。
こちらは、Addresableの対象となっているAssetを直接選択することで、
入力する手間やミスを防ぐことができます。
※ver0.6.6以降から
AssetReferenceTypeRestrictionのアトリビュートを指定して、
アセットのタイプを指定できたのですが、
いろいろ変更があったらしく、処理自体が消えました。
ver0.6のAPIReferenceも消えているので、今後どうなるのかわかりませんが、
おそらくそれぞれの指定できるTypeのAssetReferenceを呼ぶ必要があるのかと。
[Header("Asset参照(Sprite)")] [SerializeField] private AssetReferenceSprite assetReference = null; /// <summary> /// 参照読み込み。 /// </summary> void ReferenceLoad() { Addressables.LoadAsset<Sprite>(assetReference) .Completed += (op) => { img.sprite = op.Result; }; }
こんな感じでInspectorから指定できます。
Assetの解放
Addresables.ReleaseAssetで参照したAssetの解放が行えます。
/// <summary> /// アセットリスト。 /// </summary> List<Sprite> assetList = new List<Sprite>(); [Header("Asset参照(Sprite)")] [SerializeField] private AssetReferenceSprite referenceSprite = null; /// <summary> /// 参照読み込み。 /// </summary> void ReferenceLoad() { if(referenceSprite == null) { return; } Addressables.LoadAsset<Sprite>(referenceSprite) .Completed += (op) => { img.sprite = op.Result; assetList.Add(op.Result); }; } /// <summary> /// 全ての参照を解放。 /// </summary> void AllReleaseAsset() { for(var i = 0; i < assetList.Count; ++i) { Addressables.ReleaseAsset(assetList[i]); } }
参照しているAssetの情報などはAddresable Profilerより確認できます。
実際に読み込むとグラフとして表示され、下にログも残ります。
解放すると参照が消えて、色が薄くなります。
今までのAssetBundleのシステムと比べるととてもシンプルになりました。
Profilerなども用意してあり、一々ログを仕込まなくてもよくなりました。
まだPreviewということなので、今後も変更があるとは思いますが、
よりよい変更になることを期待してます。