Version: Unity 6.0 (6000.0)
言語 : 日本語
Use AssetBundles to load assets at runtime
Creating AssetBundles

アセットバンドル

AssetBundle (アセットバンドル) は Unity がランタイムにロードできるプラットフォーム特有のコード以外のアセット (モデル、テクスチャ、プレハブ、オーディオクリップ、シーン全体) を含むアーカイブファイルです。アセットバンドルは互いの依存関係を示すことができます。例えば、あるアセットバンドルのマテリアルは他のアセットバンドルのテクスチャを参照できます。ネットワークを使った効果的な配布のために、アセットバンドルはその使用の要件に応じてビルトインのアルゴリズムの中の 1 つで圧縮できます (LZMA と LZ4)。

アセットバンドルはダウンロードコンテンツ (DLC) に有用で、初期インストールサイズを削減し、エンドユーザーのプラットフォームのために最適化されたアセットを読み込み、ランタイムのメモリにかかる負担を軽減します。

スタンドアロンプラットフォーム用にビルドされたアセットバンドルは、そのプラットフォームにのみロードできます。例えば、iOS でビルドされたバンドルは Android と互換性がありません。この理由の 1 つは、シェーダー、テクスチャ、およびその他のタイプのデータが、BuildTarget に基づいてプラットフォーム特有の形式に組み込まれていることです。

アセットバンドルをビルドまたはリビルドする場合、通常は 1 つの API 呼び出しを使用してプロジェクトのすべてのアセットバンドルをまとめてビルドします。通常は、個別にビルドまたはリビルドすることはお勧めしません。なぜなら、まとめてビルドすると、他のアセットバンドルに含まれるものに依存する可能性がある各アセットバンドルのコンテンツの参照や埋め込みの方法の決定を、Unity エディターが行うからです。ただし、例外として、プロジェクト内のアセットバンドル間の参照と依存関係を理解している上級者ユーザーの場合は、プロジェクトのアセットバンドルのサブセットのみをビルドしてもよい場合があります。

アセットバンドルには何が含まれているか

アセットバンドルのロードに使用する API はシンプルな設計になっているため、アセットバンドル内のデータがどのように表現されるかの詳細が抽象化されています。ただし、構造を理解することは、特にツールを使用してアセットバンドルのコンテンツを抽出または調査する場合に便利です。

アセットバンドルは、zip ファイルに似たコンテナ形式です。バイナリ形式のヘッダーを持ち、その中に追加のファイルが埋め込まれます。これらの追加のファイルには 2 種類あります。

  • シリアル化ファイル。シリアル化された Unity オブジェクトが含まれます。これはプレイヤービルドで使用されるバイナリファイル形式と同じです。アセットを含むアセットバンドルの場合、すべてのオブジェクトが 1 つのシリアル化ファイルに書き込まれます。シーンを含むアセットバンドルには、シーンごとに 2 つのシリアル化ファイルがあります。1 つはシーン階層のオブジェクトを含むファイル、もう 1 つは参照オブジェクトを含むファイルです。
  • リソースファイル。特定のアセット (テクスチャとオーディオ) 用に別々に格納されたバイナリデータのチャンクです。この分離により、Unity はマルチスレッドコードを使用して効率的にディスクからロードできます。

アセットバンドルファイルには、常にシリアル化された アセットバンドル オブジェクトが含まれます。このオブジェクトは、アセットバンドルのコンテンツのディレクトリのように動作します。これは、特定のアセットバンドルアーカイブからアセットをロードするためにコードを介して相互作用するオブジェクトです。また、Addressables API を使用してアセットバンドルからアセットをロードするときにも内部で使用されます。

後方互換性

アセットバンドルをビルドすると、含まれるオブジェクトは、ビルドに使用した Unity エディターのバージョンの定義と、ビルドするプロジェクトで定義された C# 型を使用してシリアル化されます。各型の情報は、アセットバンドル内の_タイプツリー_と呼ばれる構造に記録されます。この型の情報はアセットバンドルのサイズに多少影響しますが、プレイヤーのバージョンがビルド時のエディターのバージョンと一致しない場合に、それらのオブジェクトをロードできるようにすることは重要です。Unity の多くの機能では、型はかなり安定しており、バージョン間でわずかな変更しか行われないため、後方互換性サポートは適切に機能します。ただし、Unity の機能が大幅に変更された場合は、新しいバージョンで期待される結果が得られるような方法で古いデータをロードできない場合があります。その場合は、新しいバージョンの Unity を使用してアセットバンドルをリビルドする必要があります。

Unity は前方互換性をサポートしていません。そのため、新しいバージョンの Unity でビルドされたアセットバンドルを古いバージョンの Unity でビルドされたプレイヤーにロードすると、コンテンツのロードに問題が発生する可能性があります。

注意デフォルトでは、ファイルのビルドに使用された Unity エディターのバージョンはアセットバンドルのヘッダー内に含まれます。この情報は後方互換性の問題を調査する際に役立ちます。ただし、アセットバンドルが不必要にリビルドされる結果となったり、エディターのマイナーアップグレードを行った後にプロジェクトがリビルドされた場合、不要なクライアントのダウンロードが発生したりする可能性もあります。これを避けるには、BuildAssetBundleOptions.AssetBundleStripUnityVersion を参照して、エディターバージョンを除外します。

スクリプトオブジェクトのサポート

アセットバンドルにはアセンブリが含まれておらず、新しい C# クラスや既存のクラスへの変更を配布するために使用されることはありません。コンパイルされたアセンブリが含まれているのはプレイヤービルドです。つまり、コードの変更をリリースするには、ゲームまたはアプリケーションのメインビルドをリビルドして再配布する必要があります。

ただし、アセットバンドルを使用して、ゲームの新しいアイテムなど、プレイヤービルドにコンパイルされたクラスのインスタンスである新しいオブジェクトを配布できます。

例えば、アセットバンドルは ScriptableObject アセットを含むことができます。アセットバンドルからこのアセットをロードすると、Unity はアセンブリ名、名前空間、クラス名に基づいて一致するクラス定義を検出します。そのクラスのインスタンスであるオブジェクトを作成し、シリアル化された値を使用してオブジェクトのフィールドを設定します。

オブジェクトが古いクラス定義に基づいてシリアル化された場合、Unity は後方互換性サポートを使用して、タイプツリーに記録されたフィールド名やその他の情報に基づいて、可能な限りフィールドを一致させます。

スクリプトでは通常、条件付きコンパイル を使用してプラットフォーム特有のコードを指定します。例えば、UNITY_STANDALONE、UNITY_IOS、UNITY_ANDROID などのスクリプトシンボルを使用します。クラスまたは構造体のフィールドが一部のターゲットでコンパイルされない場合、アセットバンドル内のオブジェクトのシリアル化にはそれらのフィールドは含まれません (また、タイプツリーにも含まれません)。これも、アセットバンドルをターゲットの各プラットフォーム用にリビルドする必要がある理由の 1 つです。

アセットバンドルのビルド方法

Unity のアセットバンドルをビルドするためにサポートされている API は 2 つあります。

  • ビルトインネイティブ API (BuildPipeline.BuildAssetBundlesAssetBundleUnityWebRequestAssetBundle など) の使用。これはマニュアルのこのセクションで説明されている機能です。ただし、この方法はかなり低レベルです。例えば、アセットの依存関係を理解し、バンドルの割り当てを自分で決定し、独自のビルドスクリプトを作成する必要があります。
  • Addressables パッケージの使用。これは推奨される、よりユーザーフレンドリーなオプションで、Addressables UI から直接アセットバンドルを定義およびビルドできます。基盤となるファイル形式と Unity の低レベルなロードサービスおよびキャッシュサービスは同じものを使用しますが、より高レベルで抽象的な API によって間接的に使用します。そのため、このセクションで説明する概念の多くは Addressables で使用されるアセットバンドルに適用されますが、実際の使用方法については Addressables のドキュメントを参照してください。
Use AssetBundles to load assets at runtime
Creating AssetBundles