ロバメモ - 素人のUnity覚書と奮闘記

素人のUnity覚書と奮闘記

Addressableでラベルを使って複数のアセットバンドルを一括で読み込みたい

ラベル設定

ラベルの管理画面を開く

方法は2通りある。
Groupsの画面のラベル設定のところから開く方法
f:id:nico-taniku:20210109085701p:plain:w300
GroupsのToolsからLabelsを選択して開く方法
f:id:nico-taniku:20210109090043p:plain:w300

ラベルの作成

管理画面上で+を押すと新規作成できる。
f:id:nico-taniku:20210109090125p:plain:w400

注意点

ラベルで読み込む場合とアドレスで読み込む場合に、同じメソッドを使うので、アドレスとラベルが被らないように注意すること

ラベルを設定する

Groupsの画面でラベルを設定できる。
f:id:nico-taniku:20210109090808p:plain

読み込みコードを書く

サンプルコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;


public class LoadAsset : MonoBehaviour
{
    IList<GameObject> list;

    void Start()
    {
        StartCoroutine(Load());
    }

    IEnumerator Load()
    {
        //アセットのロード
        var handle = Addressables.LoadAssetsAsync<GameObject>("Title", null);

        yield return handle;

        //成功時
        if (handle.Status == AsyncOperationStatus.Succeeded)
        {
            list = handle.Result;
            foreach (var value in list)
            {
                Debug.Log(value.name);
            }
        }

    }
}

出力結果

TitleImage
Button

使用するメソッド

Addressables.LoadAsset(s)Async | Addressables | 1.13.1

Addressables.LoadAssetsAsync<オブジェクトの型>("ラベル名", Action);
戻り値:AsyncOperationHandle<オブジェクトの型>

注意点:LoadAssetsAsync 複数形になってるので注意。単数だと一つずつ読み込むメソッドになる。

引数について

サンプルコードのようにコルーチンを使う場合は第二引数はnullにする。
デリゲート使う場合は適宜設定する。

読み込まれたアセットバンドルを取得するには

以下のプロパティを参照する。

AsyncOperationHandle<オブジェクトの型>.Result
値:IList<オブジェクトの型>

注意点:Listではなく、IListで返される。

違う型を同じラベルに設定した場合、型指定はどうなる?

GameObjectとAudioClipを同じラベルに設定した場合、型指定を<GameObject>にすると、GameObject型のアセットバンドルのみがリスト化される。
なので、読み込むときは同じラベルの中の同じ型のオブジェクトごとに読み込むことになる。

ラベル?アドレス?Path?name?

違いがわかりにくく、ごっちゃになってきたので整理。
ラベル:読み込みメソッドに渡す引数で、同じラベルで同じ型なら一括読み込みできる。
アドレス:読み込みメソッドに渡す引数で、同じアドレスで同じ型なら一括読み込みできる。
Path:アセット内の保存場所
名前:そのオブジェクトにつけられた名前

検証

例えば、こんな感じで作ってみた。
画像とボタンをプレハブにして、AssetBundlesというフォルダに入れる。
それぞれにAdressという同じアドレスをつける。
f:id:nico-taniku:20210109102241p:plain:w500
f:id:nico-taniku:20210109102249p:plain:w500
それぞれにLabelという同じラベルをつける。
f:id:nico-taniku:20210109101817p:plain

Pathの欄に表示されているのはこの保管場所になっているのがわかる。
f:id:nico-taniku:20210109102040p:plain:w300

"Adress"というアドレス名で読み込んで名前をコンソールに表示してみる。

    IList<GameObject> list;

    void Start()
    {
        StartCoroutine(Load());
    }

    IEnumerator Load()
    {
        //アセットのロード
        var handle = Addressables.LoadAssetsAsync<GameObject>("Adress", null);

        yield return handle;

        //成功時
        if (handle.Status == AsyncOperationStatus.Succeeded)
        {
            list = handle.Result;
            foreach (var value in list)
            {
                Debug.Log(value.name);
            }
        }
    }

f:id:nico-taniku:20210109102317p:plain:w300
それぞれのプレハブ名が表示された。

以上