アドレス可能:プランニングとベストプラクティス

今日のゲームはかつてないほど大きくなっている。最新のデバイス・ハードウェアの限界を探求し続ける中で、開発者にとって、ランタイムでコンテンツを効率的に管理することがますます重要になっている。また、パブリッシャーがゲームのリテンションとマネタイズの指標を最適化するために、小規模なゲームクライアントと動的な無線コンテンツアップデートは、多くの成功したゲームの基本要件となっています。
Unityは、開発者とパブリッシャーが今日のゲーム市場で成功するためのエンドツーエンドのパイプラインを提供します。このパイプラインは、2019年に発売されたUnityパッケージであるAddressablesで始まり、Addressablesで終わる。
Addressablesパッケージは、AssetBundleにビルドされ、実行時に動的にロードおよびアンロードされるUnityアセットを整理するためのユーザーインターフェイス(UI)とAPIを提供します。AssetBundles が基本ゲームに同梱されているか、Cloud Content Delivery のようなリモート コンテンツ配信ネットワーク (CDN) からホストされて配信されているかにかかわらず、Addressables は、必要なときに必要なアセットをロードできるようにします。
Addressablesシステムは、コンテンツ管理の多くの側面を簡素化することができますが、"セット・イット・アンド・フェザー・イット "機能ではありません。アドレッサブル アセットの編成、ビルド、ロード、アンロードの方法に関する選択は、ゲームのサ イズとパフォーマンスに大きな影響を与えます。
このガイドでは、Addressablesシステムを最大限に活用できるよう、考慮すべき最も重要な要素について説明します。このブログの最後には、一般的なAddressablesのユースケースに基づいた一般的な設定と戦略の推奨を提供する便利な「チートシート」が掲載されています。
もちろん、最善の戦略は、あなたが作ろうとしているゲームやあなたの目標によって異なる。本ガイドは、Unity Learnの資料、Unityマニュアルのドキュメント、コミュニティが運営するAddressablesのフォーラムとともに使用するリファレンスとして扱ってください。
Addressablesの中核は、AssetBundleを構築し作業するためのツールです。AddressablesのUIとAPIに入る前に、AssetBundlesのアーカイブファイル形式と実行時の影響について理解しておくことが重要です。
AssetBundlesはコンテナと考えることができます。モデル、テクスチャ、プレハブ、ScriptableObject、オーディオクリップ、さらにはUnityが実行時にロードできるシーン全体のようなアセットを含むことができる、ターゲットプラットフォーム用に構築されたアーカイブファイルです。
アセットバンドル(AssetBundle)の主な特徴は、互いに依存関係を表現できることです。例えば、AssetBundle 1にはAssetBundle 2のテクスチャに依存するプレハブが含まれているかもしれません。Addressablesを使用して実行時にプレハブをロードすると、Addressablesシステムは自動的にAssetBundle 2と依存テクスチャをメモリにロードします。また、AssetBundle 1にAssetBundle 3のアセットに依存する別のアセットがある場合、AssetBundle 3もメモリにロードされます。

ゲームの実行中、Addressablesシステムは、すべてのアセット(前述のテクスチャのような依存アセットを含む)のアクティブな参照を追跡し、どのアセットがメモリ内にある必要があるかを判断します。AssetBundleからロードされたアセットは、その参照カウントと 同じAssetBundle内の他のすべてのアセット参照カウントの両方が0になるまで、メモリから解放することはできません。AssetBundle 自身は、AssetBundle 内のすべてのアセット参照カウントが 0 になって初めてメモリから解放されます。
AddressablesとAssetBundlesの密接な関係を念頭に置いて、Addressablesコンテンツを整理する際に最も重要なルールは、一緒にロードおよびアンロードされることを期待する個別のアセットセットを含むAssetBundlesを作成することです。
Addressables を使用する際に最も重要な決定は、資産を Addressables グループにどのように整理するかということです。ここでいくつかの質問を考えてみよう:
- 多くの小グループを作るべきか、それとも少数の大グループを作るべきか?
- 各グループについて、いくつのAssetBundleを生成することを目指すべきか(つまり、そのグループ内のアセットをまとめて、別々に、あるいはラベルごとにパックすべきか)。
- ラベルを使うべきか?
- グループにはローカルとリモートのどちらのロードパスを与えるべきか?
私たちは一つの答えを出したいのですが、最適なAddressablesのグループ分け戦略は、あなたのゲームに特有のいくつかの要因によって異なります。
覚えておいてほしい:Addressablesグループは、Addressableアセットの組織構造を提供し、それらのアセットがどのようにAssetBundleに組み込まれるかを決定します。つまり、ゲーム独自の構造、目標、制限に基づき、最も効果的にAssetBundleをパック、ロード、アンロードするのが、最適な組織戦略となります。
アドレサブル・コンテンツの整理を始める前に、以下のことをしっかりと把握しておいてください:
目次ゲームの構造とロードマップ
2.あなたのゲームのプラットフォームの強みと限界
3.ゲームのパフォーマンスを最適化するために Addressables を使用する主な目的
以下、それぞれの要素に取り組んでいこう。
考慮すべき最初の要素は、ゲームの構造とロードマップである。
構造」とは、あなたのゲームの実際のアーキテクチャを意味する。あなたのゲームは、プレイヤーが予測可能な一連のレベルや環境を進んでいく、直線的なシングルプレイの旅ですか?マルチプラットフォームのPvPゲームで、何千ものバニティ・アイテムがあり、予測不可能なタイミングでインスタンス化される可能性があるのだろうか?ゲームの構造によって、アセットをロードして使用できるようにするタイミングと、アセットやAssetBundleをメモリからアンロードするタイミングが決まります。
一緒にロードする必要があり、一緒にアンロードできるアセットだけを含むAssetBundleを作成するようにしてください。ゲームが直線的な旅で、区切り点がはっきりしている場合は、Addressables グループをゲームの各セクションに関連するコンテンツの大きなサブセットに編成することを検討してください。そうすれば、それらの資産を一緒に積み下ろしすることができる。
ゲームがノンリニアで予測不可能な場合は、より小さなアセットバンドルを生成する小さなグループを選択し、よりダイナミックにロードとアンロードを行うことができます。アセットを素早く見つけ、レイアウトを最適化するために、グループには常に論理的で意味のある名前を使用することを目指しましょう。
「ロードマップ」とは、あなたのゲームが時間とともにどのように進化していくかを指す。一旦プレーヤーに出荷されたゲームは、時折バグ修正やゲームバランスのパッチを当てる以外、ほとんど変更されないのですか?それとも、プレイヤーに大規模なクライアントアップデートをインストールさせることなく、定期的に新しいコンテンツを追加することを期待しているのでしょうか?
コンテンツロードマップは、グループ化戦略の参考となります。ゲームのコンテンツが自己完結型であり、ローンチ後に更新されない場合は、前述の構造的な考慮事項を中心にグルーピング戦略を立てましょう。頻繁にコンテンツのアップデートが必要なゲームであれば、プレイヤーが必要なときに必要なものをダウンロードできるように、コンテンツをグループ分けしましょう。
ゲームが成熟するにつれて増えていくコスメティックアイテムのセットなど、実行時に一緒に必要となる個別のバンドルのコンテンツを識別するためにラベルを使用することを検討してください。また、グループ設定の「ラベルでまとめる」バンドルモードを使って、論理的にグループ化したコンテンツを細分化することもできます。
例えば、新しい「ハロウィン2023」イベントを立ち上げ、プレイヤーがコスメティックアイテムを集められるようにするとします。あなたの "Halloween 2023 Outfits "グループには、"Hats"(帽子)、"Shoes"(靴)、"Masks"(仮面)というラベルのアセットが含まれているかもしれません。そして、このグループ内のすべてのアセットに「2023年のハロウィーン」というラベルを付けることができる。このグループに "Pack Together By Label "バンドルモードを使用すると、ビルド時に3つのAssetBundleが作成されます。
そして実行時に、キャラクターカスタマイズ画面で「帽子」というラベルを持つすべてのアドレス可能なアセットをロードすることで、そのラベルを持つすべてのアセットがダウンロードされ、メモリにロードされ、プレイヤーが閲覧できるようになります。あるいは、イベントのプロモーションページで、「Halloween 2023」というラベルの付いたすべてのアドレス指定可能なアセットをロードして、プレーヤーに表示できるようにすることもできます。


ゲームの構造とロードマップを深く理解することで、ゲームのライフサイクルを通じて有益となるコンテンツ編成について、十分な情報に基づいた決定を下すことができます。
次に、各プラットフォームの強みと限界、そしてそれらがコンテンツ戦略にとってどのような意味を持つかについて説明する。
次に考慮すべきなのは、あなたが配信の対象としているプラットフォームの強みと限界だ。このセクションでは、Addressablesユーザーがターゲットとする一般的なプラットフォームと、各プラットフォームにおける重要な検討事項について説明します。
モバイルとVR
モバイルとVRプラットフォームでは、アプリのサイズ、バンドルコンテンツのサイズ、ダウンロード速度が最も重要な考慮点となる。
グループについては、プレイヤーがインストール直後に必要とするコンテンツ一式(例えば、チュートリアルを完了できるようにする)を検討してください。このコンテンツが、ベースゲームに含まれるように、ローカルのロードパスを持つグループに整理されていることを確認してください。その他のコンテンツはすべて、リモートロードパスを持つグループに編成し、プレーヤーにコンテンツを配信できるようにします。
比較的小規模なアセットバンドルを構築するグループ戦略を選択する。正確なバランスはあなたの試合次第だ。メモリを大量に消費し、一度ロードされると解放が困難になるような極端に大きなバンドルは避けてください。同様に、膨大な数の小さなバンドルは、コンテンツ更新のたびにダウンロードされる非常に大きなAddressablesカタログファイルを作成する可能性があるため、避けてください。多くの小さなバンドルは、プレイヤーが必要なコンテンツをダウンロードする速度にも影響を与える可能性があるため、ゲームの適切なバランスを決定する際には、これらの長所と短所に注意してください。
デスクトップとコンソール
デスクトップやコンソールの場合、最も重要なのはパフォーマンスだ。モバイル機器やワイヤレスVRハードウェアに比べて、デスクトップやコンソールのハードウェアは通常、メモリやディスクストレージに関する制約が少ない。これを念頭に置いて、非圧縮のAssetBundleを構築するグループ設定を考えてみましょう。これにより、可能な限り最速のロード時間を実現し、特定のプラットフォームでは効率的なパッチ適用も可能になる。
特にコンソール向けに開発する場合は、プラットフォーム特有のキャッシュ制限に細心の注意を払ってください。モバイルプラットフォームでは、ダウンロードしたコンテンツに対してUnityのAssetBundle Cacheを利用できますが、特定のコンソールやWebGLでは、Unityエンジンレベルでこの機能がデフォルトで無効になっています。遠隔地のコンテンツを放送で配信しようとするのではなく、これらのプラットフォームの新コンテンツで基本ゲームをアップデートすることを検討してください。そうでない場合は、独自のカスタムAssetBundleキャッシュシステムを作成し、そのソリューションがそれらのプラットフォームの利用規約に準拠しているかどうかを判断する必要があります。
ターゲットとするプラットフォームの強みと限界を評価した後、Addressablesシステムを使用して達成しようとしている主な目標を1つか2つ特定します。例えば以下のようにします。ベースとなるゲームのサイズを小さくすることが主な目的ですか、それともプレーヤーにコンテンツのアップデートを配信する予定ですか?これらのオプションについて、以下で詳しく説明しよう。
基本ゲームサイズの最小化
ベースゲームのサイズを最小化することを第一の目標とし、インストール後のメモリ制限や大容量のダウンロードをそれほど気にしないのであれば、シーンやリソースからリモートロードパスを持つ1つ以上のAddressableグループにできるだけ多くのアセットを移行することに主眼を置くべきです。
プロジェクト内のシーンをアドレサブルにすることを検討し、メイン プレーヤーのビルドに含める必要がある場合は、そのシーンを決定してください。インストール後にプレイヤーに配信できるものについては、それらのシーンをリモートロードパスのあるグループに含めてください。このOpen Projects Devlogのビデオで説明されているように、ほとんど空のシーンを1つ使ってプレーヤーを作り、そこからゲームの残りの部分を動的にロードすることもできます。

不要なアセットの重複の可能性と量を減らすために、どのシーンでもアドレス可能にするなら、すべてのシーンをアドレス可能にするのがベストだ。
リモートでホストされるAssetBundleを生成するグループの場合は、AssetBundle Cacheを必ず有効にしてください。この設定により、ダウンロードしたAssetBundleがプレイヤーのデバイスにキャッシュされ、セッションごとに再ダウンロードする必要がなくなります。
小さなバンドルがたくさんある場合と、大きなバンドルがいくつかある場合のランタイムへの影響を常に念頭に置いておくのは良いことだが、他の目標を考慮すると、これらの考慮事項はより適切なものになる。
遠隔地のコンテンツをプレーヤーに効率的に配信
リモート コンテンツの効率的な配信を主な目的としている場合は、「ローカル」コンテンツ (プレーヤ ビルドに含まれるアセット) と「リモート」コンテンツ (外部のコンテンツ配信ネットワークでホストされているアセット) の間で、コンテンツをどのように分割するかをグループ構成に反映させる必要があります。繰り返しになりますが、AssetBundle Cacheを有効にして、プレイヤーのデバイスにダウンロードしたコンテンツをキャッシュするようにしてください。
これらのグループのサイズ、数、およびバンドルモードは、プレイヤーにリモートコンテンツを配信するタイミングと、ダウンロードが完了するまでの待ち時間によって決まります。たとえば、ゲームの構造上、ベースゲームをインストールした直後にすべてのリモートコンテンツを配信できる場合は、Pack TogetherまたはPack Together By Labelで大きなグループを選択することができます。
セッション中、より小さなリモートコンテンツをプレイヤーに配信し、体験の妨げにならないようにする場合は、少人数のグループやバンドルモード設定を選択することで、より迅速にダウンロードできる小さなアセットバンドルが生成されます。
ほとんどの場合、リモートコンテンツを含むグループについては、AssetBundleのCRC(Cyclic Redundancy Check:巡回冗長検査)オプションの「Enabled」、「Excluding Cached」を検討してください。これにより、プレーヤーのデバイスにキャッシュされるリモート コンテンツの整合性がさらに保証され、プレーヤーのデバイスにすでにあるコンテンツをロードするために CRC を実行する追加のオーバーヘッドを回避できます。
実行時のメモリ使用量とパフォーマンスの最適化
ゲームのランタイムパフォーマンスとメモリ使用量を最適化することを第一の目的とするのであれば、Addressablesグループ編成の最も重要なルールを覚えておいてください:同時に積み下ろしをする予定の資産は、まとめておく。
一般的に言えば、これはより小さなAssetBundleを作成することを意味する。これを実現するには、小さなグループを作成したり、ゲーム内で常に同時に必要になるわけではないアセットが含まれる大きなグループには、Group Settingsの "Pack Together "バンドルモードを使用しないなど、いくつかの方法があります。
また、潜在的な問題や最適化すべき領域を発見するために、ランタイム・パフォーマンスを注視する必要がある。Unity Profiler、Memory Profilerパッケージ、Addressables Event ViewerなどのUnity公式ツールを活用して、ゲームのパフォーマンスを最適化しましょう。
Addressables プロファイラ モジュールは、Addressables イベント ビューアに取って代わる予定です。この新しいツールは、アセットやAssetBundle間の依存関係に関する詳細な情報を含め、コードがどのようにアドレス指定可能なアセットやAssetBundleをロードおよびアンロードしているかについて、さらに詳細な情報を提供します。
複数の目標
もちろん、ほとんどのプロジェクトは、アドレスアブルに関連する目標をいくつも持っている。この場合、万能なアプローチは存在しない。上記のトレードオフを評価し、あなたが定義した成功を最もよく達成できるグループ構造と設定を見つける必要があります。
Addressables1.21.3でまもなく利用可能になるAddressablesビルドレポートと Addressablesプロファイラモジュールを活用することをお勧めします。Addressables ビルド レポートは、Addressables ビルドから生成された AssetBundles に関する詳細情報(ファイル サイズ、重複の可能性、依存関係の詳細情報など)を提供します。Addressablesプロファイラモジュールは、この新しい依存性データを活用する新しいランタイム解析ツールで、Addressablesコードによって何がロードされ、なぜそれがロードされたのかについての正確な情報を提供します。
以下に、最も一般的なユースケースに基づき、推奨されるAddressablesの設定と戦略について、便利な「チートシート」をいくつかご用意しました。もちろん、これらはあくまで提案であり、その提案があなたのプロジェクト独自の構造や具体的な目標に合致するかどうかを判断するのはあなた次第だ。
Addressablesパッケージに関するご質問や詳細については、Addressablesフォーラムをご覧ください。また、ツイッターの@Unity_Jeffでも直接つながることができる。現在連載中の Tech from the Trenches シリーズの他の Unity 開発者による新しい技術ブログもぜひご覧ください。