メインコンテンツまでスキップ

UnityのAddressable Assets System(アドレッサブル)は、アセットを動的にロード・管理できる仕組みです。
特に、複数のプラットフォームやサイズの大きなゲームでのメモリ管理とロード時間の改善に役立ちます。
ここでは、基本的な使い方、実践例、メリット、注意点について解説します。



Addressableの使い方の基本

  1. Addressableのインストール

    • Unityの「Package Manager」から「Addressables」パッケージをインストールします。
  2. アセットの設定

    • アセットをAddressable化するには、インスペクターで「Addressable」のチェックをオンにし、アセットに一意の名前(Address)を付けます。このAddressを使って後でアクセスできます。
  3. Addressable Groupsの作成

    • 「Window > Asset Management > Addressables > Groups」から「Addressables Groups」ウィンドウを開きます。ここで、アセットをグループごとに整理します。
    • グループごとにビルド設定(メモリ内に保持するか、圧縮するか、外部に保持するかなど)を細かく設定できます。
  4. アセットのロードとアンロード

    • Addressables.LoadAssetAsync<T>("Address") を使ってアセットを非同期でロードします。
    • ロードしたアセットを使い終わったら Addressables.Release(asset) でメモリから解放します。


Addressableの実践例

シンプルなアセットの読み込み例

using UnityEngine;
using UnityEngine.AddressableAssets;

public class AddressableExample : MonoBehaviour
{
public string assetAddress; // インスペクターで設定できるアセットのアドレス

private GameObject loadedObject;

public void LoadAsset()
{
Addressables.LoadAssetAsync<GameObject>(assetAddress).Completed += handle =>
{
if (handle.Status == UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationStatus.Succeeded)
{
loadedObject = handle.Result;
Instantiate(loadedObject);
}
else
{
Debug.LogError("アセットのロードに失敗しました");
}
};
}

public void UnloadAsset()
{
if (loadedObject != null)
{
Addressables.Release(loadedObject);
loadedObject = null;
}
}
}


アセットバンドルを使ったレベルの動的読み込み例

ゲームのレベル(シーン)ごとにアセットをアドレッサブルで管理すると、メモリ使用量を最適化できます。

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

public class AddressableSceneLoader : MonoBehaviour
{
public string sceneAddress; // 読み込みたいシーンのアドレス

public void LoadScene()
{
Addressables.LoadSceneAsync(sceneAddress, LoadSceneMode.Additive).Completed += OnSceneLoaded;
}

private void OnSceneLoaded(AsyncOperationHandle<SceneInstance> handle)
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
Debug.Log("シーンの読み込み成功");
}
else
{
Debug.LogError("シーンの読み込みに失敗しました");
}
}

public void UnloadScene()
{
Addressables.UnloadSceneAsync(sceneAddress);
}
}


Addressableのメリット

  1. メモリ管理とロード時間の最適化

    • 必要なアセットのみをオンデマンドでロードでき、使用しないアセットを解放できるため、メモリ使用量を効率的に抑えることが可能です。
  2. マルチプラットフォーム対応

    • プラットフォームごとに異なるアセット設定が可能で、デバイスのスペックに合わせた管理がしやすくなります。
  3. 柔軟なアセット更新

    • サーバーにアップロードしたアセットを随時更新することが可能で、ゲームのアップデートを効果的に行えます。
  4. スケーラビリティの向上

    • ゲームの規模が拡大しても、ロードとメモリ管理の調整により、ゲーム全体の最適化がしやすくなります。

Addressableを使う上での注意点

  1. アセットのビルド管理

    • ビルド後のアセットのパスや依存関係が増えるため、複数のAddressable Groupsを設定する際は、メモリ負荷が高くならないようグループを慎重に構成しましょう。
  2. ロード時間

    • 非同期ロードとはいえ、アセットのサイズが大きいとロード時間が増えます。ゲームプレイに影響を与えないよう、事前にバックグラウンドでロードするなど工夫が必要です。
  3. デバッグ

    • Addressableは動的に管理されるため、エラーやロード失敗時に問題の特定が難しい場合があります。ログ出力やエラーハンドリングを適切に行うことで、デバッグをしやすくしておきましょう。
  4. アドレスの一意性

    • 同じAddress名を異なるアセットに設定するとロードが混乱するため、ユニークな名前を付けることが必須です。プロジェクト内でのネーミングルールを決めておくと良いです。
  5. デプロイメント時の構成

    • Addressableに含めるアセットのサイズや数が大きすぎると、ダウンロード量やメモリ負荷が増加し、パフォーマンスに影響する可能性があります。