まえがき
Unityの開発をする中で、Adressable Asset Systemを利用してアセットの管理を行っているときに順番通りにアセットを取得したい局面に出会いました。
アセットを一括取得する場面では、下のようにラベルを指定してアセットを一括取得すると思います。
Sprite spriteHandle = Addressables.LoadAssetsAsync<Sprite>({"任意のラベル"}, null);
ラベルで取得するアセットはAddressable windowで登録された順番が参照され、スクリプト等を利用して一括でアセットの登録した場合などでは、取り出されてくる順番がバラバラになってしまいます。
加えて、Adressable window内にはアセットを取り出す順番をソートする機能がないので、アセットを順番に取り扱うにはAdressableの内部データを操作するなど、他の方法で解決する必要があります。
以上を踏まえて自分が取れる上での解決方法をメモがてら残しておこうと思います。
動作環境
● Unity 2021.3.22f1
● Addressables 1.19.19
どう対処したか
力技で解決しました。
1.アセットそれぞれに取り出したい順番に数字で名前を振っておく。
2.ファイル名の数字部分からアドレス名を指定、それらをラベルで一括取得する。
3.アドレス名でソートして、新たな配列やリストに代入する。
コード
private IEnumerator GeneratePrefab()
{
var piyoHandle = Addressables.LoadAssetAsync<GameObject>("piyo.prefab");
var spriteHandle = Addressables.LoadAssetsAsync<Sprite>({"testSprite"}, null);
yield return new WaitUntil(() => piyoHandle.IsDone && spriteHandle.IsDone);
if (piyoHandle.Status == AsyncOperationStatus.Succeeded && spriteHandle.Status == AsyncOperationStatus.Succeeded){
//得られた結果の長さだけ配列を作成
Sprite[] Array = new Sprite[spriteHandle.Result.Count];
//中身の並び替え
for (var i = 0; i < spriteHandle.Result.Count; i++)
{
var num = int.Parse(spriteHandle.Result[i].name);
Array[num] = spriteHandle.Result[i];
}
SetActive.childrens = new GameObject[Array.Length];
//prefabから自動生成
for (var i = 0; i < Array.Length; i++)
{
var _PrefabObj = Instantiate(piyoHandle.Result, ApplyColider.instance.parentTransform);
var _PrefabRenderer = _PrefabObj.GetComponent<SpriteRenderer>();
_PrefabRenderer.sprite = Array[i];
}
}
}
今回はアドレスを用いて取得したprefabのSpriteRendererコンポーネントに、これまたアドレスを用いて取得したspriteを割り当てて生成していくケースを想定しています。
上記コードの
Sprite[] Array = new Sprite[spriteHandle.Result.Count];
//中身の並び替え
for (var i = 0; i < spriteHandle.Result.Count; i++)
{
var num = int.Parse(spriteHandle.Result[i].name);
Array[num] = spriteHandle.Result[i];
}
の部分で取得してきたspriteの長さに応じて配列を作成し、アセット名に用いている数字を数値に読み替えつつその値に応じて配列に詰め直しています。
後はforループを回して目的のprefabを生成するだけです。
参考サイト等