Addressablesとは?

Unityで動的にファイルを読み込むためにはいくつかの方法があります。

  • Resourcesフォルダにファイルを配置する
  • StreamingAssetsフォルダにファイルを配置する
  • AssetBundleを使用する

それぞれに長所と短所が存在します。

例えば、特定のフォルダにファイルを配置しなければならなかったり、

ビルドや管理が煩雑になったり、プラットフォームごとに読み込み方法を変える必要があったりと、さまざまな課題があります。

こうした課題を解決するために、公式から登場したのが Addressables です。

使用するバージョン

本記事で使用している Unity および Addressables パッケージのバージョンは以下のとおりです。

  • Unity 6000.0.40f1
  • Addressables 2.2.2

Addressablesの導入

Unity EditorのメニューからWindowPackage Managerを選択し、PackageMangerを開きます。

リストからAddressablesを選択し、Installボタンを押します。

しばらく待てば導入は完了です。

Addressables Settingを用意する

Addressablesを導入したら、Unity Editor のメニューから

WindowAsset Management > Addressables > Groupsを選択し、

Addressables Groupsウインドウを開きます。

中央のCreate Addressables Settingsボタンをクリックします。

Assetsフォルダ以下に

AddressableAssetsDataフォルダが作成されます。

この中にAddressablesで管理するアセットの情報が保存されます。

先ほどのAddressables Groupsウィンドウも以下のように変化し、

Addressablesで管理しているアセットの情報を確認できるようになります。

ファイルをAddressablesに登録する

任意のアセットをAddressables Groupsウィンドウの任意のグループ(今回はDefault Local Group)にドラッグ&ドロップします。

このとき、アセットはResourcesフォルダやStreamingAssetsフォルダ以下でなくても、

Assetsフォルダ以下であればどこにあっても問題ありません。

もしくはアセットを選択し、インスペクタの上部にあるAddressablesにチェックを入れることでも追加されます。

グループはあとから変更できます。

Addressables上の名前を変更する

アセットをAddressablesに登録すると、Addressables上でその時のファイルパスが名前として登録されます。

ファイルを読む時もこの名前を使用しますが、冗長ですし後々ファイルを移動してパスが変わるかもしれません。

名前は任意に変更できるため開発上扱いやすい名前に変更しましょう。

事前に名前付けのルールを決めておくとよいかもしれません。

名前を変更するには、Addressables Groupsウィンドウ上かインスペクタから変更できます。

アセットを読んでくる

以下の様なスクリプトを用意しました。

“Icon01”という名前でSpriteを読んできて、Imageに設定して表示しています。

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.UI;

public class AddressablesTest : MonoBehaviour
{
    [SerializeField] private Image _icon01;
    
    private void Start()
    {
        var handle = Addressables.LoadAssetAsync<Sprite>("Icon01");
        handle.Completed += (operation) =>
        {
            if (operation.Status == UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationStatus.Succeeded)
            {
                // アセットのロードが成功した場合
                _icon01.sprite = operation.Result;
            }
            else
            {
                // アセットのロードが失敗した場合
                Debug.LogError("Failed to load asset.");
            }
        };
    }
}

Startメソッドが呼ばれてから非同期でIcon01が読み込まれます。

実際には読み込みが終わるまで画面を暗転させておくなど工夫が必要です。

アセットを解放する

読み込んだアセットが必要なくなったらしっかり解放しましょう。

解放しないと無駄に使われたままのメモリが発生します。

これをメモリリークと言います。

アセットを解放するには読み込んだ時のHandleを使用します。

// Unity2021以降
handle.Release();

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

まとめ

今回はAddressablesの導入について解説しました。

Resourcesフォルダは非推奨となっており、現在はAddressablesの使用が推奨されています。

Addressablesを使用することで、以下のようなメリットがあります:

  • 必要な時に非同期でアセットを読み込めるようになり、メモリ効率が向上します
  • メモリの解放を明示的に行えるため、アプリケーションのパフォーマンス管理が可能です(ただし、メモリリークには注意が必要です)
  • アセット間の依存関係を自動で把握してビルドしてくれるため、AssetBundleのように開発者が手動で管理する必要がありません
  • 事前に設定しておけば、アプリのローカルからでもサーバー上からでもアセットを読み込めます
  • 配信済みのアプリ本体を更新することなく、一部のアセットだけを差し替える運用が可能になります

GameObjectを読み込むケースについては、別途記事でまとめる予定です。

🔗関連ページ