Addressablesとは?

AddressablesUnityが提供する、ゲーム内のアセットを効率的に管理、ロードするためのシステムです。

PrefabをAddressablesに登録する

検証用に適当なCubeを用意し、Prefabとして保存しました。

インスペクタからAddressablesに登録し、Cubeと名前を変えます。

PrefabをAddressablesから読んでくる

適当なスクリプトを用意して、Updateメソッド内で以下の様に書いてみました。

private void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        var handle = Addressables.LoadAssetAsync<GameObject>("Cube");
        handle.Completed += (operation) =>
        {
            Instantiate(handle.Result);
        };
    }
}

Cubeが生成されるようになりました。 Addressables.LoadAssetAsync<GameObject> でアセットを読んできます。 通常通りhandle.ResultInstantiateすることでPrefabを生成できます。 ロードを事前に済ませておいても同様の結果になります。

private AsyncOperationHandle<GameObject> _cubeHandle;

private void Start()
{
    _cubeHandle = Addressables.LoadAssetAsync<GameObject>("Cube");
}

private void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        Instantiate(_cubeHandle.Result);
    }
}

InstantiateAsyncを使う

Addressables.InstantiateAsyncメソッドを使用して非同期で生成することが出来ます。 InstantiateAsyncの場合はロードからInstantiateまで行われるため、 Completedが呼ばれた際には、生成済みのGameObjectを取得できます。

private void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        var handle = Addressables.InstantiateAsync("Cube");
        handle.Completed += (operation) =>
        {
            var go = handle.Result;
            
            // goに対して何らかの処理を行う
        };
    }
}

通常のInstantiateのように、座標や回転を与えたり、親Transformを指定することも出来ます。

var handle = Addressables.InstantiateAsync("Cube", new Vector3( 1f, 5f, 0f), Quaternion.identity);

解放するには?

生成したGameObjectが不要になった場合は、 通常通りDestroyメソッドに渡せばシーン上から削除できます。

Destroy(gameObject);

ですがAddressables上には参照が残っておりそのままでは解放されません。 ロード時に返ってきたHandleを使って以下の様に解放しましょう。

// Unity2021以降
handle.Release();

// もしくは、こちらでも可
Addressables.Release(handle);

ちゃんと解放しておかないと、メモリリークとなり、

何度も繰り返しているとメモリが確保できなくなります。

まとめ

今回はAddressablesPrefabを読み込む場合について解説しました。 ロード自体は通常のアセットと同じですが、直接Instantiateするメソッドも用意されています。 生成したGameObjectDestroyで削除できますが、

Release()Addressablesから解放することも忘れないようにしましょう。

🔗関連ページ