【Unity】Addressablesのラベル機能を使ってアドレスをグループ化する

UnityのAddressablesのラベル機能を使ってアドレスをグループ化する方法をまとめました。

Unity2019.2.10
Addressable1.3.8

Addressablesの基礎知識

この記事ではAddressableアセットシステムのラベル機能についてまとめます。
Addressableの概念や基礎知識についての説明はこの記事では省略しますが、
以下の記事にまとめていますので、必要に応じて参照してください。

light11.hatenadiary.com

ラベル?

ラベルとは、Addressableのアドレスに対して付けられるタグのようなものです。
同じラベルが付いたアセットをまとめて読み込んだり、ダウンロードしたりするために使います。
またラベルはアドレスと違って複数付けられるという特徴があります。

ちなみにですが、UnityのラベルとAddressableのラベルは別物なので注意が必要です。

ラベルを付ける

ラベルはAddressables Groupsウィンドウから設定します。
まずWindow > Asset Management > Addressables > Groupsからウィンドウを開きます。

f:id:halya_11:20191113173958p:plain

ラベルを付けるにはLabelsのドロップダウンをクリックします。
まだラベルを作っていないので、Manage Labelsをクリックしてラベル管理ウィンドウを開きます。

f:id:halya_11:20191113174149p:plain

ウィンドウが開いたら適当にラベルを作っておきます。

f:id:halya_11:20191113174306p:plain

あとはこれを適当なアドレスに設定します。

f:id:halya_11:20191113174614p:plain

ラベルを使う

それではこのラベルを使ってアセットをロードしてみます。

using UnityEngine;
using UnityEngine.AddressableAssets;

public class Example : MonoBehaviour
{
    private async void Start()
    {
        var handle = Addressables.LoadAssetsAsync<Object>("ExampleLabel", null);
        await handle.Task;
        foreach (var item in handle.Result) {
            Debug.Log(item);
        }
    }
}

これを再生すると、ラベルを付けたアセットがすべてロードされることが確認できます。

f:id:halya_11:20191113175316p:plain

また、AssetLabelReferenceを使うとInspectorからラベルを指定することもできます。

using UnityEngine;
using UnityEngine.AddressableAssets;

public class Example : MonoBehaviour
{
    [SerializeField]
    private AssetLabelReference _labelReference;

    private async void Start()
    {
        var handle = Addressables.LoadAssetsAsync<Object>(_labelReference, null);
        await handle.Task;
        foreach (var item in handle.Result) {
            Debug.Log(item);
        }
    }
}

注意点

一点、ラベルとアドレスの意図しない名前被りには注意が必要です。

上述のようにAddressables.LoadAssetsAsync()のインターフェースは
ラベルを指定する場合とアドレスを指定する場合で変わらないため、
もしラベルと同名のアドレスがある場合にはそのアドレスもロード対象となってしまいます。

関連

light11.hatenadiary.com