Addressables システムへのアップグレード
このドキュメントでは、既存のプロジェクトを変更して、Addressable (アドレス指定可能) アセットを活用する方法を説明します。
Addressables システムを使用しない場合、Unity には、アセットの参照とロードを行う "従来" の方法がいくつか用意されています。
- シーンデータ: シーンまたはシーン内のコンポーネントに直接追加するアセット。アプリケーションによって自動的にロードされます。シリアル化されたシーンデータと、シーンによって直接参照されるアセットが 1 つのアーカイブにパッケージ化され、ビルドされたプレイヤーアプリケーションに加えられます。[シーンの変換] および [Addressable でないシーンでの Addressable アセットの使用] を参照してください。
- プレハブ: ゲームオブジェクトとコンポーネントを使用して作成し、シーンの外部に保存するアセット。[プレハブの変換] を参照してください。
- Resources フォルダー: プロジェクトの Resources フォルダーに配置し、Resources API を使用してロードするアセット。Resources ファイル内のアセットは 1 つのアーカイブにパッケージ化され、ビルドされたプレイヤーアプリケーションに含められます。Resources アーカイブは、シーンデータとは別のアーカイブです。[Resources フォルダーの変換] を参照してください。
- AssetBundle: AssetBundle にパッケージ化され、AssetBundle API を使用してロードされるアセット。[AssetBundle の変換] を参照してください。
- StreamingAssets: StreamingAssets フォルダーに配置するファイル。StreamingAssets フォルダー内のあらゆるファイルは、ビルドされたプレイヤーアプリケーションにそのまま含められます。[StreamingAssets 内のファイル] を参照してください。
Addressables への変換
Addressables を使用してビルドされたコンテンツは、その Addressables ビルドでビルドされた他のアセットだけを参照します。使用または参照されるコンテンツは、両方の Addressable 内に含まれます。また、シーンデータ と Resource フォルダー による Player ビルドは、ディスクとメモリ両方がロードされている場合は両方に複製されます。この制限があるため、すべての シーンデータ と Resource フォルダー を Addressables ビルドシステムに変換することが効率的な方法として推奨されます。これにより、複製によるメモリのオーバーヘッドが削減され、すべてのコンテンツを Addressables を使用して管理できます。コンテンツはローカルにもリモートにも配置でき、[コンテンツ更新] ビルドによる更新も可能になります。
シーンの変換
Addressables をプロジェクトに統合する最も簡単な方法は、Build Settings のリストからシーンを移動し、それらを Addressable にすることです。ただし、リストには、アプリケーションの起動時に Unity がロードするシーンが 1 つ必要です。このために、最初の Addressable シーンをロードするだけの新しいシーンを作成します。
シーンを変換するには、以下を実行します。
- 新しい "初期化" シーンを作成します。
- Build Settings ウィンドウ (メニュー: File > Build Settings) を開きます。
- シーンのリストに初期化シーンを加えます。
- それ以外のシーンをリストから削除します。
- プロジェクトリストの各シーンをクリックし、Inspector ウィンドウで Addressable オプションをオンにします。または、Addressables Groups ウィンドウ内のグループにシーンアセットをドラッグすることもできます (新しい初期化シーンは Addressable にしないでください)。
- シーンをロードするコードを更新して、SceneManager メソッドではなく、Addressables クラスのシーンをロードするメソッドを使用します。
この時点で、シーン内のすべてのアセットが Addressable グループに加えられました。Addressables コンテンツをビルドすると、Addressables システムによってそれらが AssetBundle にパッケージ化されます。すべてのシーンに対して 1 つのグループだけを使用している場合、ランタイムのロードとメモリのパフォーマンスは、Addressables を使用する前のプロジェクトの状態とほぼ同等になります。
この 1 つの大きな Addressable シーングループは、複数のグループに分割することができます。これを最も効率的に行う方法は、プロジェクトの目標によって異なります。各シーンのロードとアンロードを互いに独立して行うことができるように、シーンを独自のグループに分けて移動することができます。この過程で [Analyze ツール] を使用すると、複数のシーンで共有される重複アセットがないかどうかを確認できます。アセット自体を Addressable にすると、2 つのバンドルから参照されるアセットの重複を回避できます。多くの場合、共有されるアセットも独自のグループに移動して、AssetBundle 間の相互依存を削減する方が効率的です。
Addressable でないシーンでの Addressable アセットの使用
シーンを Addressable にしない場合でも、[AssetReference] を介して、Addressable アセットをシーンデータの一部として使用できます。
カスタムの MonoBehaviour クラスまたは ScriptableObject クラスに AssetReference フィールドを追加すると、アセットを直接参照として割り当てる場合とほとんど同じように、Unity エディターでフィールドに Addressable アセットを割り当てることができます。主な違いは、AssetReference フィールドに割り当てられたアセットのロードと解放を行うために、コードをクラスに追加して必要があるということです (直接参照は、シーン内のオブジェクトが Unity によってインスタンス化されるときに自動的にロードされます)。
Note
Addressable アセットは、Addressable でないシーンの UnityEngine コンポーネントのフィールドには使用できません。例えば、Addressable メッシュアセットを Addressable でないシーンの MeshFilter コンポーネントに割り当てても、その Addressable バージョンのメッシュデータはシーンに使用されません。代わりに、Unity はメッシュアセットをコピーし、2 つのバージョンのメッシュをアプリケーションに加えます。1 つはそのメッシュが属する Addressable グループ用にビルドされた AssetBundle に、もう 1 つは Addressable でないシーンのビルトインシーンデータに加えます (Addressable シーンで使用すると、メッシュデータはコピーされず、常に AssetBundle からロードされます)。
直接参照をカスタムクラス内の AssetReference に置き換えるには、以下のステップに従います。
- オブジェクトへの直接参照をアセット参照に置き換えます (例えば、
public GameObject directRefMember;
はpublic AssetReference assetRefMember;
になります)。 - 直接参照の場合と同じように、適切なコンポーネントのインスペクターにアセットをドラッグします。
- Addressables API を使用して、割り当てたアセットをロードするためのランタイムコードを追加します。
- ロードしたアセットが不要になったときに解放するコードを追加します。
AssetReference フィールドの使用の詳細については、[アセット参照] を参照してください。
Addressable アセットのロードの詳細については、[Addressable アセットのロード] を参照してください。
プレハブの変換
プレハブを Addressable アセットに変換するには、その Inspector ウィンドウで Addressables オプションをオンにするか、Addressables Groups ウィンドウ内のグループにプレハブをドラッグします。
Addressable シーンで使用するプレハブは、必ずしも Addressable にする必要はありません。Addressables は、シーンの階層に追加されたプレハブを、シーンの AssetBundle に格納するデータの一部として自動的に含めます。ただし、複数のシーンでプレハブを使用する場合は、プレハブを使用するシーンごとにプレハブデータが複製されないように、プレハブを Addressable アセットにする必要があります。また、ランタイムに動的にプレハブをロードしてインスタンス化する場合も、そのプレハブを Addressable にする必要があります。
Note
Addressable でないシーンでプレイハブを使用する場合は、プレハブが Addressable かどうかにかかわらず、プレハブデータがビルトインシーンデータにコピーされます。[Analyze ツール] の Check Scene to Addressable Duplicate Dependencies ルールを使用すると、Addressable アセットグループと Addressable でないシーンデータの間で重複しているアセットを特定できます。
Resources フォルダーの変換
プロジェクトで Resources フォルダー内のアセットをロードする場合は、それらのアセットを Addressables システムに移行できます。
- アセットを Addressable にします。これを行うには、各アセットの Inspector ウィンドウで Addressable オプションを有効にするか、Addressables の Groups ウィンドウでアセットをグループにドラッグします。
- Resources API を使用してアセットをロードするランタイムコードをすべて、Addressables API でアセットをロードするように変更します。
- ロードしたアセットが不要になったときに解放するコードを追加します。
シーンに関しては、以前の Resources アセットを 1 つのグループに保持すれば、ロードとメモリのパフォーマンスは同等になります。プロジェクトに合わせて個別のグループにアセットを分割すると、パフォーマンスと柔軟性を高めることができます。[Analyze ツール] を使用して、不必要に重複している複数の AssetBundle があるかどうかを確認してください。
Resources フォルダー内のアセットを Addressable としてマークすると、プロジェクト内にある、Resources_moved という名前の新しいフォルダーに自動的にアセットが移動されます。移動されたアセットのデフォルトアドレスは、フォルダー名を除いた古いパスになります。例えば、以下のようなロードコードがあるとします。
Resources.LoadAsync\<GameObject\>("desert/tank.prefab");
これは以下のように変更されます。
Addressables.LoadAssetAsync\<GameObject\>("desert/tank.prefab");.
Addressables システムを使用するようにプロジェクトを変更した後は、Resources クラスの特定の機能を別の方法で実装することが必要になる場合があります。
例えば、Resources.LoadAll 関数について考えます。以前は Resources/MyPrefabs/ フォルダーにアセットがあり、Resources.LoadAll<SampleType>("MyPrefabs"); を実行していた場合、SampleType
型に一致する Resources/MyPrefabs/ 内のすべてのアセットがロードされます。Addressables システムでは、これとまったく同じ機能がサポートされるわけではありませんが、Addressable の [ラベル] を使用すると、同様の結果を得ることができます。
AssetBundle の変換
初めて Addressables Groups ウィンドウを開いたときには、すべての AssetBundle を Addressables グループに変換するかどうかをたずねるメッセージが表示されます。これが、AssetBundle 設定を Addressables システムに移行する最も簡単な方法です。この場合でも、ランタイムコードを更新して、Addressables API を使用してアセットのロードと解放を行うようにする必要があります。
AssetBundle 設定を手動で変換する場合は、Ignore ボタンをクリックします。AssetBundle を Addressables に手動で移行するプロセスは、シーンと Resources フォルダーの場合に説明したプロセスと同様です。
- 各アセットの Inspector ウィンドウで Addressable オプションを有効にするか、Addressables Groups ウィンドウでアセットをグループにドラッグして、アセットを Addressable にします。Addressables システムは、既存の AssetBundle とアセットのラベル設定を無視します。
- AssetBundle または UnityWebRequestAssetBundle API を使用してアセットをロードするランタイムコードをすべて、Addressables API でアセットをロードするように変更します。AssetBundle オブジェクト自体やアセットの依存関係を明示的にロードする必要はありません。これらは Addressables システムによって自動的に処理されます。
- ロードしたアセットが不要になったときに解放するコードを追加します。
Note
アセットのアドレスのデフォルトパスは、そのファイルパスです。このパスをアセットのアドレスとして使用する場合は、バンドルからのロードと同じ方法でアセットをロードできます。バンドルとすべての依存関係のロードは Addressable Asset System によって処理されます。
自動変換オプションを選択する場合も、同等の Addressables グループに手動でアセットを追加する場合も、グループ設定に応じて、結果は同じアセットを含む同じバンドルのセットになります (バンドルファイル自体は同一ではありません)。[Analyze ツール] を使用すると、不要な重複やその他の潜在的な問題がないかどうかを検証できます。[Event Viewer] ウィンドウを使用すると、アセットのロードとアンロードの動作が想定どおりであることを確認できます。
StreamingAssets 内のファイル
Addressables システムを使用する場合も、引き続き StreamingAssets フォルダーからファイルをロードできます。ただし、このフォルダー内のファイルは Addressable にできず、プロジェクト内の他のアセットを参照することもできません。
Addressables システムは、ビルド中に、そのランタイム設定ファイルとローカル AssetBundle を StreamingAssets フォルダーに配置します (これらのファイルはビルドプロセスの完了時に削除されるため、エディターに表示されることはありません)。