【Unity】Resourcesの代わりにAddressablesを使用する

【Unity】Resourcesの代わりにAddressablesを使用する Unity
記事内に広告が含まれています。
スポンサーリンク

記事作成時の動作環境

  • Unity 2022.3.24f1
  • Addressables 1.21.20

公式ではResourcesは非推奨

少し古いサイトだと、Instantiateなどの際にResourcesフォルダーを使用してアセットを読み込んでいるコードをよく見かけます。
しかしUnityのドキュメントによるとResourcesフォルダーの使用は非推奨となっています。

Resources フォルダーは、しばしば Unity プロジェクトで発生する各種問題の原因となります。Resources フォルダーの不適切な使用が原因で、プロジェクトのビルドサイズの膨張やメモリの極端な過剰使用の原因となり、アプリケーションの起動時間が著しく長くなってしまうことがあります。

引用元:Resources フォルダー – Unity マニュアル

アセット管理システム「Addressables」

Resourcesの代わりになる機能として、AssetBundleAddressable Asset SystemAddressablesの2つがあります。
今回はAddressablesの方を使用します。

Addressablesとは、簡潔に言うとアドレスを使用してアセットを簡単にロードすることが出来るシステムです。
アドレスを割り当てることで、アセットの場所に関係なくロード呼び出せるようになります。
複雑なコードを書く必要が無く、ResourcesAssetBundleよりも簡単に使用することが出来ます。

インストール

Window -> Package Managerを開き、Packages: Unity Registryを選択した状態で検索するとパッケージが表示されます。
Addressablesを選択してInstallをクリックします。

インストールが完了したらWindow -> Asset Management -> Addressables -> Groupsを開きます。

Create Addressables Settingsをクリックします。

これで導入完了です。

アセットの設定

次にAddressablesで管理するアセットを設定していきます。

方法1:Inspectorで設定

Inspectorの上の方にAddressableのチェックボックスが追加されています。
管理したいアセットを選択してここにチェックを入れるだけでOKです。

方法2:Addressables Groupsで設定

Window -> Asset Management -> Addressables -> Groupsを開き、グループの中にアセットをドラッグ&ドロップして追加します。

Addressable Nameロード時に使用する文字列(アドレス)で、好きな名前に変更することが出来ます。

フォルダをドラッグ&ドロップしてまとめて追加することもできますが、フォルダ内のアセットの名前は変更できなくなります。

アセットのロード

単体ロード

1つのアセットをロードする場合はAddressables.LoadAssetAsyncを使用します。
ロードは非同期で行われます。

Addressable Nameで指定したアドレスを使ってロードします。

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

public class LoadTest : MonoBehaviour
{
    AsyncOperationHandle<Sprite> opHandle;

    public IEnumerator Start()
    {
        // 「Test2_Img」というアドレスのSpriteをロード
        opHandle = Addressables.LoadAssetAsync<Sprite>("Test2_Img");
        yield return opHandle;

        if (opHandle.Status == AsyncOperationStatus.Succeeded)
        {
            Debug.Log(opHandle.Result.name);
        }
    }

    void OnDestroy()
    {
        Addressables.Release(opHandle);
    }
}

複数ロード

複数のアセットを同時にロードする場合はAddressables.LoadAssetsAsyncを使用します。
こちらはアドレスではなくラベルを使用します。

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

public class LoadTest : MonoBehaviour
{
    AsyncOperationHandle<IList<Sprite>> opHandle;

    public void Start()
    {
        // 「Image」というラベルのSpriteをロード
        opHandle = Addressables.LoadAssetsAsync<Sprite>("Image", OnLoadSprite);
    }

    void OnLoadSprite(Sprite sp)
    {
        Debug.Log(sp.name);
    }

    void OnDestroy()
    {
        Addressables.Release(opHandle);
    }
}

インスタンスを生成

Addressables.InstantiateAsyncでインスタンスを生成することが出来ます。

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class LoadTest : MonoBehaviour
{
    AsyncOperationHandle<GameObject> opHandle;

    public void Start()
    {
        opHandle = Addressables.InstantiateAsync("Box");
    }

    void OnDestroy()
    {
        Addressables.ReleaseInstance(opHandle);
    }
}

プレハブ化したCubeオブジェクトに「Box」というアドレスを設定して上記のスクリプトを実行。
インスタンス化できました。

メモリの開放

読み込んだアセットはAddressables.ReleaseAddressables.ReleaseInstanceで明示的に開放してやる必要があります。
Destroyは使わずに、必ずReleaseReleaseInstanceで開放するようにしましょう。

参考

コメント

タイトルとURLをコピーしました