Unity Addressableの基本的な使い方

Addressableとは?

Addressable(アドレサブル)とは、一言でいうと「色んなアセットにアドレスをつけて管理できる機能」のことです。
ではなぜアドレスをつけると便利になるかというと、以下のようなメリットがあるためです。

  • アドレスを指定することで、スクリプトからアセットをロード/破棄できる
  • iOSAndroidのストアを更新しなくても、アセットのアプデを実現できる

また似た機能にAsset Bundle、Resourcesが存在しますが様々な問題があるため、多くの場合でAddressableが良いとされています。

基本の使い方

PackageManagerからAddressablesをインストールします。

画像等のアセットに対して、インスペクター最上部にAddressableのチェックボックスが現れます。

チェックを入れるとアドレスが表示されます。 Addressableは、このアドレスを使ってファイルをロードします。

スクリプトでファイルを読み込むには、以下のようなコードを書きます。

using System.Collections;
using UnityEngine;
using UnityEngine.AddressableAssets;

public class AddressableSample : MonoBehaviour
{
    private void Start()
    {
        var handle = Addressables.LoadAssetAsync<Sprite>("Assets/Images/Star.png");
        handle.Completed += handle =>
        {
            Debug.Log($"Sprite is loaded. {handle.Result}");
        };
    }
}

Addressables.LoadAssetAsyncは、引数に指定されたアドレスを非同期で読み込み<>で指定した型に変換します。
また、非同期のハンドルAsyncOperationHandleを戻り値として返します。
handle.Completedは、ロード完了時に実行される関数を設定することができます。

また、使い終わったら破棄するのを忘れないようにしましょう。
以下のコードをよしななタイミングで呼び出してください。

Addressables.Release(handle);

ちょっとだけ応用

非同期処理はyield returnを用いてコルーチンとして待機することもできます。

private void Start()
{
    StartCoroutine(LoadSpriteCoroutine());
}

private IEnumerator LoadSpriteCoroutine()
{
    var handle = Addressables.LoadAssetAsync<Sprite>("Assets/Images/Star.png");
    yield return handle;
    Debug.Log($"Sprite is loaded. {handle.Result}");
}

非同期処理はasync, awaitを用いて待機することもできます。

private void Start()
{
    LoadSpriteAsync();
}

async void LoadSpriteAsync()
{
    var sprite = await Addressables.LoadAssetAsync<Sprite>("Assets/Images/Star.png").Task;
    Debug.Log($"Sprite is loaded. {sprite}");
}