UnityのAddressablesは、アセットを「アドレス」で読み込み、使い終わったら解放するための仕組みです。
Resourcesフォルダとの違いから、入れ方、読み込みと解放の基本までを、公式マニュアルで整理しました。
- Package Managerから入れ、Addressables Groupsで設定を作る
- アセットは、アドレス、ラベル、AssetReferenceのどれかで読み込む
- 基本は非同期。同期完了待ちにはプラットフォームと処理上の制限がある
- 読み込んだ数だけ、解放も必要
Addressablesの実機での再現は含まず、公式ページの記載(2026年9月30日に確認)に基づきます。
仕様や数値は変わることがあるので、最新は公式ページで確かめてください。
バージョンは、Addressables 2.3.16のマニュアルに基づきます。
押さえておきたい最新仕様:Addressables 4.xのマニュアルとの違い
2026年10月12日(日本時間)に、Unity公式のAddressablesパッケージのマニュアルの最新版を見直したところ、表示されたバージョンは4.1.1でした。
この記事の詳しい手順と画面の説明は、冒頭に書いたとおりAddressables 2.3.16のマニュアルに基づいています。
最新のマニュアルでは、次の点が確認できました。
- Addressablesは、もともとUnityのAssetBundleの仕組みの上に設計されたもので、新しい「コンテンツディレクトリ」のシステムにも対応している
- 「Choose a content build system」という項目で、コンテンツビルドを作るときに、コンテンツディレクトリかAssetBundleかのシステムを選ぶ
- 目次には、パッケージの設定、Addressableアセットの作成と整理、ビルド、読み込み、リモートコンテンツの配信と更新、最適化ツール、既知の問題が並ぶ
4.1の公式資料では、コンテンツディレクトリはUnity 6.6以降で利用するローカル配信用の方式です。
リモート配信・コンテンツ更新やUnity 6.6未満ではAssetBundleを選びます。
Package Managerで手元の版を確認し、対応するマニュアルと照合してください。
Addressablesとは
公式の説明では、コンテンツを整理してパッケージにするツールと、実行中にアセットを読み込んで解放するAPIの組み合わせです。
- アドレスでアセットを読み込める
- アセットは、アプリの中に置いても、リモートから配信してもよい
- メッシュ、シェーダー、アニメーションなどの依存関係を、自動で管理する
- 参照カウントでメモリを管理し、プロファイリングの道具もある
- 2.3系はAssetBundleを使用する。4.xではコンテンツディレクトリも選択できる
Resourcesフォルダとの違い
Resourcesフォルダは、Resources という名前のフォルダに置いたアセットを、Resources.Load で読み込む仕組みです。
Resourcesの中のアセットは、ビルドに自動で含まれます。
Addressablesでは、アセットにアドレスを付けて、必要なときに読み込みます。
移行のガイドには、次の説明があります。
- ResourcesのアセットをAddressableにすると、Resources_moved という新しいフォルダへ自動で移る
- 既定のアドレスは、元のパスからResourcesのフォルダ名を除いたもの
- Resources.LoadAll に直接対応するものはなく、ラベルで代わりにする
- 解放の処理を、新しく追加する必要がある
次は呼び出しの比較用断片です。
Resources側は拡張子を省略し、Addressables側はGroupsに登録したアドレスを使います。
例では移行後のアドレスをdesert/tank.prefabとします。
実際のコードでは完了・失敗の処理と、使い終えたハンドルの解放を追加してください。
// 移行前:Resources内の相対パス。拡張子を付けない
Resources.LoadAsync<GameObject>("desert/tank");
// 移行後:Groupsで確認したアドレスを指定する
var handle = Addressables.LoadAssetAsync<GameObject>("desert/tank.prefab");Resourcesが非推奨かどうかや、起動時間への影響は、今回の公式ページでは確認できていないので書きません。
パッケージの入れ方
- Window > Package Manager を開く
- パッケージの一覧を「Unity Registry」にする
- Addressablesを選ぶ
- 右下の「Install」を押す
入れたあとは、Addressables Groupsのウィンドウを開き、「Create Addressables Settings」を選びます。
AddressableAssetsData フォルダができ、設定のファイルが入ります。
公式は、このフォルダをバージョン管理に入れるよう書いています。
Addressable Groupsウィンドウ
開き方は、Window > Asset Management > Addressables > Groups です。
| 列 | 内容 |
|---|---|
| Group Name / Addressable Name | グループの名前と、アセットのアドレス |
| Icon | アイコン |
| Path | 元のアセットのパス |
| Labels | 付けたラベル |
ツールバーには、グループを作るNew、ビルドと読み込み先を決めるProfile、Play Mode Script、Buildなどがあります。
アセットをAddressableにする
公式が挙げている方法は4つです。
- アセットのInspectorで、Addressableを有効にする
- InspectorのAssetReferenceのフィールドに、アセットを割り当てる
- Addressables Groupsのウィンドウで、グループへアセットをドラッグする
- Addressableに指定したフォルダの中に、アセットを置く
グループを指定しなければ、既定のグループに入ります。
あなたはどっち?ResourcesかAddressablesかの判定フロー
アセットの読み込み方法は、次の順で選びます。
- Resourcesフォルダに置いたアセットを、そのまま読み込めばよい:Resources.Loadの仕組みです。Resourcesの中のアセットは、ビルドに自動で含まれます。
- アセットにアドレスを付けて、必要なときだけ読み込みたい:Addressablesを使います。アドレス、ラベル、AssetReferenceのどれかで読み込みます。
- アセットをリモートから配信したい:AddressablesのAssetBundle方式を検討します。4.1のコンテンツディレクトリはローカル配信用です。
- Resources.LoadAllのように、まとめて読みたい:直接対応するものはありません。ラベルで代わりにします。
- ResourcesからAddressablesへ移す:解放の処理を、新しく追加する必要があります。
Resourcesが非推奨かどうかや、起動時間への影響は、公式ページで確認できていないため、この記事では判断しません。
読み込みの基本
読み込みの方法は3つあります。
- AssetReference:Inspectorに割り当てる
- アドレスの文字列
- ラベル:同じラベルのアセットをまとめて読む
非同期とは、読み込みの完了を待つ間も他の処理を進める方式です。
ハンドルは、処理の状態や結果を取得し、後で解放するために保持する値です。
複数のアセットに同じラベルを付けても、LoadAssetAsyncが返すのは最初に見つかった1件です。
ラベルでまとめて読み込むときは、複数件を扱うLoadAssetsAsyncを使います。
使い分けは、Addressables 2.3.16の単体・複数アセットの読み込みで確認できます。
基本の読み込みAPIは非同期です。
WaitForCompletionで同期的に完了を待つ方法もありますが、メインスレッドの停止やシーン処理のデッドロックに注意が必要です。
2.3.16の公式資料ではWebGLは非対応で、リモートAssetBundleの取得にも使用しないよう説明されています。
次は呼び出し部分だけの断片です。
handleはAsyncOperationHandle<GameObject>、addressは登録済みアドレスの文字列、Handle_Completedは同じ型のハンドルを受け取るコールバックとして別途定義します。
handle = Addressables.LoadAssetAsync<GameObject>(address);
handle.Completed += Handle_Completed;完了したときに、operation.Status が AsyncOperationStatus.Succeeded かどうかで成功を判定します。
成功時は、完了したハンドルのResultからアセットを取得します。
この呼び出しでPrefabを読み込んだだけでは、シーンにオブジェクトは生成されません。
生成する場合は別途Instantiateを呼び、生成物がアセットを使う間は読み込みハンドルを保持します。
単体読み込みが失敗した場合は、成功時の処理へ進まず、そのハンドルをAddressables.Releaseで解放してください。
解放したハンドルは無効になるため、終了処理でも同じものを再度解放しないよう管理します。
完了・失敗時の分岐は、公式の非同期処理のハンドルを参照してください。
解放を忘れない
公式は、読み込んだアセットは使い終わったら解放するよう書いています。
読み込みの呼び出しごとに、対応する解放の呼び出しを対にして、メモリリークを避けます。
参照カウントは読み込みで増え、解放で減ります。
2.3系のAssetBundle方式では、アセットの参照が0でも所属Bundleが使用中なら、メモリは直ちに解放されません。
Profilerで実際の読み込み・解放を確認します。
| 読み込み方 | 解放の書き方 |
|---|---|
| AssetReference | reference.ReleaseAsset() |
| アドレスまたはラベル | Addressables.Release(handle) |
この表はアセット読み込みの基本例です。
InstantiateAsyncで生成したインスタンスやシーン読み込みには、それぞれのAPIに対応する解放が必要です。
同じハンドルを二重解放せず、利用中のアセットを早く解放しないように管理してください。
詳しくは2.3系のメモリ管理と同期完了待ちの制限を確認してください。
読み込みの件数、失敗時の解放、保持期間を2026年10月26日に2.3.16公式資料で再照合しました。
4.1.1のビルド方式の比較でも、コンテンツディレクトリの対象とローカル配信の制約を確認しています。
導入後に確認すること
- Groupsで登録アドレスを確認し、同じ文字列と対象の型を読み込み処理に指定する。
- 成功時の状態と取得したアセット名を確認し、必要な生成処理を行う。
- 検証用の存在しないアドレスでも試し、失敗時に生成処理へ進まず、ハンドルを解放できるか確認する。
- 利用を終えた後に解放し、Profilerでアセットと依存Bundleの状態を確認する。
以上は読者向けの確認手順です。
掲載コードは呼び出しの断片であり、コンパイル・実機ロード・失敗時処理・解放は今回検証していません。
