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

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

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

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

BuildAssetBundleOptions

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

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

  • BuildAssetBundleOptions.None: このバンドルオプションには LZMA 形式の圧縮が使われています。LZMA 形式の圧縮はシリアライズした (複数の) データファイルから成る 1 つの圧縮 LZMA ストリームです。LZMA 圧縮では、バンドル全体を使用前に解凍する必要があります。結果として、ファイルのサイズは可能な限り小さくなりますが、解凍のために読み込み時間が多少長くかかります。バンドルのアセットを使用するためには最初にバンドル全体を解凍する必要があります。
    バンドルはいったん解凍されると、ディスク上で LZ4 圧縮を使って再度圧縮されます。LZ4 圧縮では、バンドルのアセットを使用する前にバンドル全体を解凍する必要はありません。BuildAssetBundleOptions.None は、たとえば、キャラクターの全てのデータやシーンをまとめてバンドルにパッケージ化する場合などに適しています。
    LZMA 圧縮は、オフサイトのホストから最初にアセットバンドルをダウンロードするときにのみ、ファイルサイズを小さくするために推奨されます。いったんファイルがダウンロードされたら、LZ4 圧縮したバンドルとしてキャッシュされます。

  • 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: {}

Which shows the contained assets, dependencies, and other information.

The Manifest Bundle that was generated will have a manifest, but it’ll look more like this:

ManifestFileVersion: 0
AssetBundleManifest:
  AssetBundleInfos:
    Info_0:
      Name: scene1assetbundle
      Dependencies: {}

これは、アセットバンドルの関連情報と依存関係を表しています。ここでは、 単に AssetBundleManifest オブジェクトがこのバンドルに含まれていることを、理解しておいてください。AssetBundleManifest オブジェクトはランタイムにどのバンドルの依存関係を読み込むかを見つけるのに、非常に役立ちます。このバンドルとマニフェストオブジェクトの使い方に関して詳しくは、マニュアルの Using AssetBundles Natively を参照してください。


<span class=“page-edit”>• 2017–05–15 <!– include IncludeTextNewPageNoEdit –></span><br/>

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