環境
- Unity 2020.3.18f1
- Addressables 1.18.19
手順
今回は検証のためいらすとやからいくつか素材をダウンロードして使います。
また、検証で作ったプロジェクトはGithubに上げております。
アセットの登録
-
Windows > Asset Management > Addressables > Groups
で設定ウィンドウを開く - ダウンロードした素材をドラッグ&ドロップして登録
-
Labels > Manage Labels
でラベルの管理ウィンドウを開く
- 「+」ボタン押して付けたい名前を入力。ここでは
OnePiece
にします。 - 一括選択してラベルをつける
これでアセットの登録が完了です。
スクリプトの作成
今回は「ボタンを押したらロードを開始して、読み込んだアセット毎をログで出力する」というスクリプトを作る。
LoadAsset.cs
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.EventSystems;
public class LoadAsset : MonoBehaviour, IPointerClickHandler
{
public async void OnPointerClick(PointerEventData eventData)
{
// タイプ指定しない場合Texture2Dアセットもロードされてしまい、その後のLoadAssetでエラーになる
// var locations = await Addressables.LoadResourceLocationsAsync("OnePiece").Task;
var locations = await Addressables.LoadResourceLocationsAsync("OnePiece", typeof(Sprite)).Task;
foreach (var location in locations)
{
Addressables.LoadAssetAsync<Sprite>(location).Completed += (op =>
{
Debug.Log($"{op.Result.name} loaded");
});
}
}
}
ここで大事なのは、Addressables.LoadResourceLocationsAsync
を使うときに、第2引数のtype
はデフォルトでnull
となっていますが、タイプを指定していない場合、図のようにロケーションの取得で同じアセットが複数回登場してしまうことがある。
特にイメージアセットの場合は、同じアセットがSprite
とTexture2D
の2種類としてカウントされているようです。
終わりに
Addressable.LoadResourceLocationsAsync
でアドレスを取得するときにあらかじめタイプを指定するか、
取得したアドレスに対して読み込むときに
if (location.ResourceType == typeof(Sprite))
で型のチェックをした方が無難でしょう。