Content directories: Beyond the AssetBundle
George Ing - Unity Technologies
Senior Engineering Manager
このウェブページは、お客様の便宜のために機械翻訳されたものです。翻訳されたコンテンツの正確性や信頼性は保証いたしかねます。翻訳されたコンテンツの正確性について疑問をお持ちの場合は、ウェブページの公式な英語版をご覧ください。
Unityにおけるコンテンツについて
Unity 2.1以降、控えめなAssetBundleは、プレイヤーバイナリ外で配布されるUnityコンテンツを支えてきました。この過去20年間で、ワールド最大級のタイトルを含む非常に多くのゲームが、データ表現としてアセットバンドルを使用しています。
基本的なレベルでは、各AssetBundleは分布、ストレージ、ロードのための不可分な単位です。AssetBundleはバンドルレベルで依存関係を追跡し、効率性のために一緒にダウンロード、ロード、アンロードされる必要がある、より大きなモノリシックな単位を形成します。
この仕様により、タイトルがアセットバンドルのレイアウトを定義する方法は、ランタイムパフォーマンスからダウンロードサイズに至るまですべての主要因となっています。これは、AssetBundleを直接使用する場合でも、Addressablesパッケージ経由で使用する場合でもtrueです。
今日は、Unityランタイムについて別のことを話します。
コンテンツディレクトリの紹介
コンテンツディレクトリは、AssetBundleの基盤的で、より高性能で、より粒度の細かい代替手段です。これらは、プレイヤーに同梱されるAssetBundleの代替として、Unity 6.6で利用可能です。Unity 7の生成中に、完全で粒度の細かいオーバー・ザ・エア配信を処理するために技術スタックが拡張されます(これについては後ほど詳しく説明しますが、非常にクールです)。
アセットを大きなロード可能なユニットにベイクするのではなく、コンテンツディレクトリは、ハードウェアリソースの完全な飽和と暗示的なコンテンツ重複排除により、個々のアーティファクト(メッシュ、テクスチャなど)を独立して識別、ロード、アンロードする能力をUnityランタイムに提供します。

Unityプロジェクトでのコンテンツ管理は、ビルドの高速化やアセットの配置、AssetBundleのレイアウトに関する懸念が減り、これまで以上に簡単になりました。
あなたがビルドするゲームは、より小さく、高速で、暗示的に重複排除され、新しいロード可能なリファレンスタイプを介して完全な動的メモリ管理にアクセスできます。プレイヤーにバンドルされているコンテンツにAddressablesを使用している方のために、コンテンツディレクトリに切り替えることができます。これはゼロコード変更で可能です。
どうしてこれが起こったのですか?パイプラインの各ステージの内部を外観てみましょう。
馴染みのある基盤:Build
2019年頃、私たちはUnityにおける真剣なビルド基盤に何を求めるかについて議論していました。それは、全コアで並列化され、決定論的で、完全にキャッシュされ、マシン間でビルドデータを共有できるものでした。実は、私たちの同僚の何人かが、そのアセットインポートフレームワークというプロパティを持つAPIを何年も出荷していたことがわかりました。
コンテンツディレクトリのビルドプロセスは、標準のアセットインポーターフレームワーク内で実行されます。各アセットは、アセットインポーターによって個別に構築され、サンドボックス化され、アウトプロセスで実行されます。ビルドは決定論的であり、アセットデータベースのキャッシング、全ハードウェアコアの完全な彩度、および高速な共有ビルドのためのネイティブアクセラレータサポートを備えています。
このビルドシステムについて聞いたのは初めてではないかもしれません。Unity 2023.1で予告したマルチビルドパイプラインを覚えている方もいるかもしれません。これは同じ基盤です。

出力は、非常に粒度の細かいアーティファクトの緩いグループ、それらの間の依存関係を追跡する小さなマニフェスト、そしてビルドをこれまで以上に理解しやすくするための新しい診断ファイルです。
それは信じられないほど簡単です。
馴染みのある基盤:宛先
コンテンツディレクトリをビルドしてアーティファクトを見ると、各アーティファクトがかなり奇妙なハッシュ名を持っていることに気づくでしょう。
c0152db4dd710be51b2decb997325f34.cff0a44ad4a4babd121543fd44032928e7.resS4226b5c16a50dab6eff0f08dd1253d4b.resource
クールなのは、それはランダムなハッシュではないということです。代わりに、コンテンツディレクトリリシステムはGitのような技術が使用するのと同じコンテンツアドレス指定ストレージパターンを使用します。各コンテンツファイルは、そのコンテンツのハッシュによって名前が付けられ、参照されます。このパターンは、ネイティブな特徴としてコンテンツを暗示的に重複排除できるため、Unityランタイムにとって非常に有用です。
とはいえ、trueの依存関係関係グラフを持つコンテンツアドレス指定ストレージは高いチャーンのリスクを伴います。2つのアーティファクト間の最も単純な関係を考慮してください。
A → B
Bを更新し、Bのハッシュが変更されます。残念ながら、AがBを参照しているため、Aのハッシュも変更されます。さらに悪いことに、それが連鎖的に上層部にカスケードます。
代わりに、アーティファクトはコンテンツハッシュで互いをリファレンスするのではなく、安定IDでリファレンスします。ビルドマニフェストは、安定IDをコンテンツハッシュにマッピングする小さなルックアップテーブルを保持しています。
これで、ランタイムはロードするために必要なものがすべて揃いました!
馴染みのある基盤:をロード
コンテンツディレクトリでは、非常に高性能な動的ローディングシステムを導入しています。
コンテンツディレクトリがマウントされると、ローディングシステムはマニフェストを読み込み、アーティファクト間の安定ID依存関係を解決します。各アーティファクトが完全に独立してロードおよびアンロードされ、共存するアーティファクトからの汚染がゼロになります (アセットバンドルの問題、つまり単一の巨大で分割不可能な単位を思い出してください)。Gone.)
DOTSユーザーにとって、アーティファクトの基盤となるファイル形式もかなり見覚えがあるかもしれません。コンテンツディレクトリは、2022年にDOTSで導入したコンテンツファイル形式の次世代を生成しロードし、4年間マルチスレッドのEntitiesロードを支えてきた技術をすべてのアセットにも適用します。
これは読み取り操作とデシリアライズ操作の両方で完全に非同期であるローディングシステムです。これは、より高いロード帯域幅とプラットフォーム固有の非同期読み取りAPIの利用を意味します。

さらにエキサイティングなことに、コンテンツディレクトリの基盤により、Loadableと呼ばれるモダンなロード可能なリファレンスタイプを初めてUnityにもたらすことができます。
Loadable bodyMesh;bodyMesh.Load();
これは、コンテンツディレクトリリベースのプロジェクトのためにエンジンに直接組み込まれた、真のロード可能リファレンスです。Loadableによって参照されるオブジェクトはビルドに引き込まれますが、Loadableを呼び出すまでロードされません。非常に馴染みのあるScriptableObjectインターフェースとロードアブルを結合することで、動的にロードされるコンテンツを素早く整理できます。
それは私たちが非常に興奮している原則です。コンテンツディレクトリとロードアブルを基盤として、Unity内のあらゆるアセットは、キャラクター作成者の断片からストリーミングされるTerrain (地形) のチャンクに至るまで、アセットバンドルレイアウトやグループ定義を設計する必要なく、独立してロードおよびアンロードできる単位になることができます。
Unityで大スケールにゲームを構築することが、これほど簡単になったことはありません!
コンテンツディレクトリを試す:Slime Rancher 2
ここ数ヶ月間、いくつかのパートナーが親切にも、彼らのゲームでコンテンツディレクトリをテストさせてくれました。
例えば、モノミパークの優れたゲーム『スライムランチャー2』を取り上げ、コンテンツディレクトリに切り替えることによって得られるいくつかの利点を外観てみましょう。(Slime RancherはSteamで入手可能!)スライムレンジャー, スライムレンジャー 2)
このデータは、MacBook Pro (M5 Max) で実行された Unity エディター バージョン Unity 6.6 Beta (6000.6.0b10) に基づいています
素晴らしいのは、新しいローディングシステムの利点がユーザーにすぐにわかることです。さらにクールなのは、Slime Rancher 2 が既存の Addressables プロジェクトであり、コードの変更なしにコンテンツディレクトリに切り替わったことです。
Unityエコシステム全体のゲームが6.6でのコンテンツディレクトリのリリースによって何を得るのか、私たちは率直に待ちきれません。しかし、それには疑問が残ります。リモートコンテンツはどうでしょうか?
次に何が来るか:リモートコンテンツ配信
今年のUnite Seoul Roadmap Presentationにいらっしゃる皆様は、ジェイソン・マンが、新しいコンテンツディレクトリの基盤が今後のUnity 7世代におけるリモートコンテンツ配信をずっと容易にするだろうと冗談を言ったことを覚えているかもしれません。それが実際に何を意味するのか、そしてこれまでに議論してきた要素とどのように結びつくのかについて簡単に話しましょう。
要約すると、コンテンツディレクトリを使用することで、アーティファクトとその依存関係を一意に識別できる、小さなハッシュ駆動のマニフェストが得られます。そのアーティファクトはすべてプレイヤーと一緒に運ばれなければならないのですか?
答えはきっぱりとノーです。

最新のHTTP標準のおかげで、Unityは大量のリソーススリクエストをマルチプレックスできるようになりました。
それをコンテンツディレクトリの基盤と組み合わせることで、ランタイムはデバイスがどのアーティファクトを欠いているかを正確に判断し、それらだけをローカルストレージにダウンロードしてロードでき、共在性、データ、または依存するAssetBundleについて心配する必要がなくなります。更新は個々のアーティファクトレベルで伝播し、マニフェストがコンテンツハッシュを使用して動作するため、ランタイムはどのアーティファクトが古いかを安価に判断し、差分のみを取得できます。
この近未来のUnityランタイムは必要なコンテンツのみをダウンロードするため、開発時間を短縮し、プレイヤーをより早くゲームに投入し、CDNコストを削減します。
このプロジェクトについては2027年にさらに共有します。
Unity 6.6でコンテンツディレクトリを試してみましょう
本日共有するのは、Unityのコンテンツを根本的に見直し、ランタイム全体に「デフォルトでパフォーマンスを確保する」という考え方をもたらす、長い旅の第一段階です。コンテンツディレクトリは、プレイヤーに同梱されるコンテンツについては6.6で利用可能になり、Unity 7世代ではリモートコンテンツを処理するように拡張されます。
コンテンツディレクトリを始めるには、ドキュメントをご覧ください。フィードバックがある場合は、ご連絡ください。
モノミパークのFriendsたちに改めて感謝します。彼らの素晴らしいタイトルでコンテンツディレクトリオフ紹介するのを手伝ってくれてありがとう!(スライムレンジャー, スライムレンジャー2).