ノート: このセクションでは、ビルトインの BuildPipeline.BuildAssetBundles() API を使用して AssetBundle (アセットバンドル) を作成する方法について説明します。推奨するよりユーザーフレンドリーな方法は、Addressables パッケージを使用する方法です。
ドキュメントの アセットバンドルのワークフロー で、3 つの引数を BuildPipeline.BuildAssetBundles 関数に渡すコードサンプルがあります。もう少し実際的に掘り下げてみましょう。
Assets/AssetBundles は、アセットバンドルの出力先ディレクトリです。これを任意のディレクトリに変更することができます。そのフォルダーはビルドを始める前にすでに存在するフォルダーでなければなりません。
BuildAssetBundleOptions
は数種類あり、様々な効果を指定することができます。すべてのオプションの表は、スクリプトリファレンスの BuildAssetBundleOptions を参照してください。
必要に応じて自由に BuildAssetBundleOptions
を組み合わせることができますが、AssetBundle (アセットバンドル) の圧縮に関しては、3 つの特定の BuildAssetBundleOptions
があります。
BuildAssetBundleOptions.None
:このバンドルオプションでは LZMA 形式の圧縮を使用します。これはシリアライズされたデータファイルから成る 1つの圧縮 LZMA ストリームです。LZMA 圧縮では、バンドル全体が使用前に解凍されている必要があります。これにより、ファイルサイズは最小限に抑えられますが、圧縮解凍のためのロード時間が若干長くなります。この BuildAssetBundleOptions を使用する場合、バンドルからアセットを使用するには、バンドル全体を最初に圧縮解除する必要があることに注意してください。
一旦バンドルが解凍されると、バンドルからアセットを使用する前に、バンドル全体を解凍する必要がない LZ4 圧縮を使用してディスク上で再圧縮されます。これは、バンドルがから1 つのアセットを使用する場合に、すべてのアセットがロードされるようなアセットが含まれている場合に最適です。キャラクターやシーンのすべてのアセットのパッケージ化を行う場合に、この方法を使用すると良い場合があります。
LZMA 圧縮を使用するのは、ファイルサイズが小さいため、オフサイトのホストからアセットバンドルを最初にダウンロードする場合にのみ推奨されます。 UnityWebRequestAssetBundle を通してロードされた LZMA 圧縮アセットバンドルは自動的に LZ4 圧縮に再圧縮され、ローカルファイルシステムにキャッシュされます。バンドルを他の方法でダウンロードして保存する場合は、AssetBundle.RecompressAssetBundleAsync APIを使用してバンドルを再圧縮できます。
BuildAssetBundleOptions.UncompressedAssetBundle
: このバンドルオプションでは、データをまったく圧縮しないでバンドルをビルドします。圧縮しない不利な点は、ファイルのダウンロードサイズが大きくなることです。しかし、いったんダウンロードが終わると、読み込み時間はずっと早くなります。非圧縮のアセットバンドルは 16 バイトに揃えられています。
BuildAssetBundleOptions.ChunkBasedCompression
: このバンドルオプションでは、LZ4 という圧縮方法を使用します。LZ4 ではファイルの圧縮サイズは LZMA より大きくなります。しかし、LZMA と異なり、使用前にバンドル全体を解凍する必要がありません。LZ4 では、「かたまり」に基づいたアルゴリズムを使用し、アセットバンドルを部分的、もしくは、かたまりごとに読み込むことが可能です。1 つのかたまりを解凍すると、たとえアセットバンドルの他のかたまりが解凍されていなくても、解凍したかたまりに含まれるアセットは使用することができます。
ChunkBasedCompression
を使うことで、ディスク上のサイズを縮小できるという利点に加え、圧縮されていないバンドルと同等の読み込み時間を実現します。
BuildTarget.Standalone
: これにより、アセットバンドルをどのターゲットプラットフォームに使用するかをビルドパイプラインに指示します。スクリプトリファレンスの BuildTarget に可能なビルドターゲットが明記してあるリストがあります。ただし、ビルドターゲットをハードコードしたくない場合は、EditorUserBuildSettings.activeBuildTarget
の利用も便利です。これを使うと、ビルドのターゲットとなる現在設定されているプラットフォームを自動的に検知し、そのターゲットに基づいてアセットバンドルをビルドします。
適切にビルドスクリプトを設定したら、最後にバンドルをビルドします。Assets > Build AssetBundles の順に選び処理を始めます。
問題なくアセットバンドルをビルドしたら、アセットバンドルのディレクトリに当初予想していたよりも多くのファイルがあることに気がつくでしょう。正確にいうと、2*(n+1) 個余分です。いったい BuildPipeline.BuildAssetBundles
で何が起こっているかを見てみましょう。
エディターで指定したアセットバンドルにはすべて、アセットバンドルと同じ名のファイルと、アセットバンドル名 + “.manifest” というファイルがあります。
作成したアセットバンドルとは名前が異なる新たに加わったのバンドルとマニフェストがあります。それらは(アセットバンドルが構築された)ディレクトリの名前に基づいて名前が付けられます。これがマニフェストバンドルです。このバンドルには、AssetBundleManifest オブジェクトが含まれています。これは、ランタイムでロードする必要があるバンドルの依存関係を特定するのに役立ちます。このバンドルとマニフェストオブジェクトの使用方法については、アセットバンドルを使いこなす のドキュメントを参照してください。
アセットバンドルファイルには .manifest の拡張子がなく、アセットをロードするためにランタイムにロードします。
アセットバンドルファイルは複数のファイルを内部に持つアーカイブです。このアーカイブの構造は、それがアセットバンドルなのかシーンのアセットバンドルなのかによって、多少変わります。以下は通常のアセットバンドルの構造です。
シーンのアセットバンドルは通常のアセットバンドルと異なり、シーンとそのコンテンツのストリームのロードのために最適化されています。
追加の Manifest Bandle (マニフェストバンドル) も含め生成されたすべてのバンドルに対し、関連するマニフェストファイルが生成されます。そのマニフェストファイルには .manifest 拡張子があり、任意のテキストエディターで開くことができます。バンドルの巡回冗長検査 (Cyclic Redundancy Check, CRC) データや依存データなどの情報を含んでいます。通常のアセットバンドルのマニフェストファイルは以下のようなものです。
ManifestFileVersion: 0
CRC: 2422268106
Hashes:
AssetFileHash:
serializedVersion: 2
Hash: 8b6db55a2344f068cf8a9be0a662ba15
TypeTreeHash:
serializedVersion: 2
Hash: 37ad974993dbaa77485dd2a0c38f347a
HashAppended: 0
ClassTypes:
- Class: 91
Script: {instanceID: 0}
Assets:
Asset_0: Assets/Mecanim/StateMachine.controller
Dependencies: {}
これには含まれるアセット、依存関係、その他の情報が示されています。
マニフェストバンドルにはマニフェストファイルも生成されます。それは以下のようになります。
ManifestFileVersion: 0
AssetBundleManifest:
AssetBundleInfos:
Info_0:
Name: scene1assetbundle
Dependencies: {}
このファイルには、アセットバンドルがどのように関連し、どのような依存関係があるかを記録します。これは、マニフェストバンドル内の AssetBundleManifest オブジェクトによって記録される情報に似ており、テキストファイルであるため、人間が読むこともでき、外部ツールによる解析にも便利です。