【Unity】Addressablesの使い方を初心者向けに完全解説
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.Load | AssetBundle | Addressables |
|---|---|---|---|
| 基本概念 | Resources フォルダから直接ロード | アセットをバンドル化して配信 | AssetBundle を内部的に管理 |
| 設定の手間 | ほぼ不要 | 非常に多い | やや必要 |
| ロード方式 | 同期 | 同期 / 非同期 | 非同期が基本 |
| メモリ解放 | ❌ 制御不可 | ⭕ 可能 | ⭕ 明示的に可能 |
| ビルドサイズ | ❌ 全部含まれる | ⭕ 必要な分のみ | ⭕ 必要な分のみ |
| 動的ロード | ❌ 不可 | ⭕ 可能 | ⭕ 可能 |
| 主な用途 | 小規模・検証用 | 高度な運用 | 現代Unityの標準 |
Addressablesの使い方
Addressablesの導入方法
- Unityメニューから
Window → Package Manager を開く Addressablesを検索- インストール
- メニューから
Window → Asset Management → Addressables → Groups


Addressablesの設定
アセットをAddressablesにセットする
- 対象のPrefabやアセットを選択
- Inspectorの Addressable Groupsにドラッグアンドドロップ
- 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は「難しい仕組み」ではありません。
正しく理解すれば、非常に強力な武器になります。
サイトアイコン-2-150x150.png)