Unityでアセット管理をしていると、

  • 「Resources はもう使わない方がいい」
  • 「Addressables を使えと言われたけど正直よくわからない」
  • 「なんとなく使ってるけど、これ正しいの?」

と感じたことはありませんか?

AddressablesはUnity公式の強力な仕組みですが、
仕組みを理解せずに使うと、逆にハマりやすいのも事実です。

特に、

  • 非同期処理を意識していない
  • ハンドルの解放をしていない
  • Address と Label の違いを知らない

このあたりは、初心者がつまずきやすいポイントです。

本記事では、Addressablesについて
「なぜ必要なのか → どう使うのか → 何に注意すべきか」を
初心者でも順番に理解できるように解説します。

この記事でわかること

  • Addressablesとは何か
  • Resources・AssetBundleとの違い
  • Addressablesの導入手順
  • Addressablesの基本的な設定方法
  • オブジェクトのロードとインスタンス生成方法
  • ロード失敗時のエラー処理
  • オブジェクトの正しい解放方法
  • Address と Label の使い分けの考え方

Addressablesとは?

Addressablesとは、Unity公式が提供しているアセット管理・ロードシステムです。

アセットを「アドレス(文字列)」で管理し、必要なときに非同期で安全にロードできます。

内部的には AssetBundle を利用していますが、開発者が直接扱う必要はありません。

そのため、

  • AssetBundle の複雑な設定
  • 依存関係の管理
  • 配信単位の設計

といった部分を意識せずに、
動的ロードやメモリ管理を行えるのが特徴です。

なぜAddressablesはハマりやすいのか?

Addressablesが難しく感じられる理由はシンプルです。

  • 非同期ロードが前提
  • ロード結果はハンドルで管理
  • 解放は開発者責任

Resources のように

var obj = Resources.Load<GameObject>("Enemy");
Instantiate(obj);

という感覚で使うと、

  • ロード完了前に使ってしまう
  • 解放せずにメモリリークする

といった問題が発生します。

「同期ロード感覚のまま使う」のが最大の落とし穴です。

Resources・AssetBundle・Addressables の違い

それぞれの違いを整理すると、以下のようになります。

項目Resources.LoadAssetBundleAddressables
基本概念Resources フォルダから直接ロードアセットをバンドル化して配信AssetBundle を内部的に管理
設定の手間ほぼ不要非常に多いやや必要
ロード方式同期同期 / 非同期非同期が基本
メモリ解放❌ 制御不可⭕ 可能⭕ 明示的に可能
ビルドサイズ❌ 全部含まれる⭕ 必要な分のみ⭕ 必要な分のみ
動的ロード❌ 不可⭕ 可能⭕ 可能
主な用途小規模・検証用高度な運用現代Unityの標準

Addressablesの使い方

Addressablesの導入方法

  1. Unityメニューから
    Window → Package Manager を開く
  2. Addressables を検索
  3. インストール
  4. メニューから
    Window → Asset Management → Addressables → Groups

Addressablesの設定

アセットをAddressablesにセットする

  1. 対象のPrefabやアセットを選択
  2. Inspectorの Addressable Groupsにドラッグアンドドロップ
  3. Address(文字列)を設定

※アドレス名はPrefab名そのままにしない方が安全
(後のリファクタ・差し替え対策)

オブジェクトをロードする(インスタンス生成)

Addressablesは非同期処理です。そのため、即時にはAssetを使えません。

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

public class AddressableSample : MonoBehaviour
{
    public void LoadEnemy()
    {
        Addressables.LoadAssetAsync<GameObject>("Enemy/Goblin")
            .Completed += OnLoaded;
    }

    private void OnLoaded(AsyncOperationHandle<GameObject> handle)
    {
        if (handle.Status == AsyncOperationStatus.Succeeded)
        {
            Instantiate(handle.Result);
        }
    }
}

オブジェクトのロードに失敗した時のエラー処理

これをしないと、失敗時に原因不明の挙動になります。

private void OnLoaded(AsyncOperationHandle<GameObject> handle)
{
    if (handle.Status == AsyncOperationStatus.Succeeded)
    {
        Instantiate(handle.Result);
    }
    else
    {
        Debug.LogError("Addressables ロード失敗");
    }
}

Address と Label の違い(重要)

Addressablesには2つの管理方法があります。

Address(1対1)

  • 固定アセットをロードしたい
  • 常に同じPrefabを使う
Addressables.LoadAssetAsync<GameObject>("Enemy/Goblin");

Label(1対多)

  • 同じカテゴリのアセットをまとめたい
  • ランダム生成・弾種・ガチャなど
Addressables.LoadResourceLocationsAsync("Enemy");

Labelは「どれをロードするか自分で選ぶ」必要があります
(そのため処理が少し長くなります)

※投稿者が作成した「パチンコまつり」ではLabelで検索してからAddressを指定するという方法を取りました。(ランダム性を作りたかったため)

オブジェクトを解放する

Addressablesでは、ロードしたら必ず解放する必要があります。

LoadAssetAsync を使った場合

Addressables.Release(handle);

InstantiateAsync を使った場合(推奨)

Releaseしないとメモリに残り続ける
→ メモリリークの原因になる

var handle = Addressables.InstantiateAsync("Enemy/Goblin");

// 解放
Addressables.ReleaseInstance(handle);

まとめ

  • AddressablesはUnity公式のアセット管理システム
  • Resourcesの代替として非常に有効
  • 非同期ロードとメモリ管理が最大の強み
  • Address / Label を目的に応じて使い分ける
  • 解放処理を忘れないことが最重要
  • 小規模開発ですべてを置き換える必要はない
  • 重い・数が多いアセットから段階的に導入するのがベスト

Addressablesは「難しい仕組み」ではありません。
正しく理解すれば、非常に強力な武器になります。