アセットバンドル用のアセットの準備
アセットバンドルの依存性

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

ドキュメントの アセットバンドルワークフロー で、3 つのアーギュメントを BuildPipeline.BuildAssetBundles 関数に渡すコード例があります。もう少し実際的に掘り下げてみましょう。

Assets/AssetBundles: これは、アセットバンドルの出力先ディレクトリです。これを任意のディレクトリに変更することができます。そのフォルダーはビルドを始める前にすでに存在するフォルダーでなければなりません。

BuildAssetBundleOptions

BuildAssetBundleOptions を指定可能なオプションが数種類あり、それぞれ効果が異なります。すべてのオプションの表は、スクリプトリファレンスの BuildAssetBundleOptions を参照してください。

必要に応じて自由に BuildAssetBundleOptions を組み合わせることができますが、アセットバンドルの圧縮に関しては、3 つの特定の BuildAssetBundleOptions があります。

  • BuildAssetBundleOptions.None: This bundle option uses LZMA Format compression, which is a single compressed LZMA stream of serialized data files. LZMA compression requires that the entire bundle is decompressed before it’s used. This results in the smallest possible file size but a slightly longer load time due to the decompression. It is worth noting that when using this BuildAssetBundleOptions, in order to use any assets from the bundle the entire bundle must be uncompressed initially.
    Once the bundle has been decompressed, it will be recompressed on disk using LZ4 compression which doesn’t require the entire bundle be decompressed before using assets from the bundle. This is best used when a bundle contains assets such that to use one asset from the bundle would mean all assets are going to be loaded. Packaging all assets for a character or scene are some examples of bundles that might use this.
    Using LZMA compression is only recommended for the initial download of an AssetBundle from an off-site host due to the smaller file size. LZMA compressed asset bundles loaded through UnityWebRequestAssetBundle are automatically recompressed to LZ4 compression and cached on the local file system. If you download and store the bundle through other means, you can recompress it with the AssetBundle.RecompressAssetBundleAsync API.

  • BuildAssetBundleOptions.UncompressedAssetBundle: このバンドルオプションでは、データをまったく圧縮しないでバンドルをビルドします。圧縮しない不利な点は、ファイルのダウンロードサイズが大きくなることです。しかし、いったんダウンロードが終わると、読み込み時間はずっと早くなります。

  • BuildAssetBundleOptions.ChunkBasedCompression: このバンドルオプションでは、LZ4 という圧縮方法を使用します。LZ4 ではファイルの圧縮サイズは LZMA より大きくなります。しかし、LZMA と異なり、使用前にバンドル全体を解凍する必要がありません。LZ4 では、「かたまり」に基づいたアルゴリズムを使用し、アセットバンドルを部分的、もしくは、かたまりごとに読み込むことが可能です。1 つのかたまりを解凍すると、たとえアセットバンドルの他のかたまりが解凍されていなくても、そのかたまりに含まれるアセットは使用することができます。

「かたまりに基づく圧縮」を使うことで、ディスク上のサイズを縮小できるという利点に加え、圧縮されていないバンドルと同等の読み込み時間を実現します。

BuildTarget

BuildTarget.Standalone: これにより、アセットバンドルをどのターゲットプラットフォームに使用するかをビルドパイプラインに指定します。スクリプトリファレンスの BuildTarget に可能なビルドターゲットが明記してあるリストがあります。ただし、ビルドターゲットをハードコードしたくない場合は、EditorUserBuildSettings.activeBuildTarget の利用も便利です。これを使うと、現在行おうとしているビルドのターゲットプラットフォームを自動的に検知し、そのターゲットに基づいてアセットバンドルをビルドします。

適切にビルドスクリプトを設定したら、次にバンドルをビルドします。前述の例にしたがうと、Assets > Build AssetBundles の順に選び処理を始めます。

問題なくアセットバンドルをビルドしたら、アセットバンドルのディレクトリに当初予想していたよりも多くのファイルがあることに気がつくでしょう。正確にいうと、2*(n+1) 個余分です。いったい BuildPipeline.BuildAssetBundles で何が起こっているかを見てみましょう。

エディターで指定したアセットバンドルにはすべて、アセットバンドル名のついたファイルと、アセットバンドル名 + “.manifest” というファイルがあります。

他にも作成したアセットバンドルと名前が違うバンドルやマニフェストが含まれています。それらの名はアセットバンドルがビルドされ配置されたディレクトリの名前に由来しています。これはマニフェストバンドルです。これに関しては後で詳しく説明します。

アセットバンドルファイル

このファイルには .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 オブジェクトがこのバンドルに含まれていることを、理解しておいてください。AssetBundleManifest オブジェクトはランタイムにどのバンドルの依存関係を読み込むかを見つけるのに、非常に役立ちます。このバンドルとマニフェストオブジェクトの使い方に関して詳しくは、マニュアルの ネイティブに AssetBundles を使用する を参照してください。


• 2017–05–15 編集レビュー 無しにパブリッシュされたページ

アセットバンドル用のアセットの準備
アセットバンドルの依存性