アセットバンドルのビルドに使用できるクラスメソッドは3つあります:
BuildPipeline.BuildAssetBundle により,どんな種類のアセットでもアセットバンドルをビルドできます。
BuildPipeline.BuildStreamedSceneAssetBundle は,データが利用可能となったときにシーンのストリーミングおよびロードしたい場合に使用します。
BuildPipeline.BuildAssetBundleExplicitAssetNames は BuildPipeline.BuildAssetBundle とほぼ同様ですが,追加の引数によって各オブジェクトに対応したカスタム文字列の識別子(名前)を指定できます。
アセットバンドルのビルドはエディターのスクリプティングを通じて行います。 BuildPipeline.BuildAssetBundle のスクリプティング ドキュメントにこの基本的な例があります。
このサンプルを実行するために,上記のリンクからExportAssetBundlesという名前のC#スクリプトにコピー&ペーストします。このスクリプトをEditorという名前のフォルダに配置してUnity Editorで動作するようにします。
次に
メニューから,二つのメニューオプションが表示されます。。 (選択範囲からからビルド - 依存関係をトラッキング)。これにより現在のオブジェクトからアセットバンドルをビルドし,全ての依存関係が含まれます。例えば,プレハブがいくつかの階層レイヤーから構成される場合,再帰的に全ての子オブジェクトとコンポーネントを追加します。
。(選択範囲からからビルド - 依存関係をトラッキングしない)。これは前述手法の反対のオプションであり,選択範囲のアセットのみを単独で含みます。
この例では,新規のプレハブを作成すべきです。最初に新規のキューブを作成するために
を選択すると,階層ビューに新規のキューブが作成されます。次にキューブを階層ビューからプロジェクトビューにドラッグ&ドロップして,オブジェクトのプレハブが作成されます。プロジェクトのキューブのプレハブを右クリックして Cube.unity3dとして保存すると,プロジェクトウィンドウは次のようになります。
を選択します。 こうすると,バンドルアセットを保存するウィンドウが表示されます。もし “AssetBundles” という新規のフォルダを作成して,キューブをこの時点で,アセットバンドルの Cube.unity3dをローカルのストレージまたは好きなサーバにアップロードすることが出来ます。
AssetDatabase.ImportAsset を使用して, BuildPipeline.BuildAssetBundle をコールする直前にアセットの再インポートを強制的に行い,さらに AssetPostprocessor.OnPreprocessTexture を使用することで必要なプロパティをセットすることが出来ます。次にサンプルにより,アセットバンドルをビルドする際に,様々なテクスチャ圧縮方式をセットする方法を確認できます。
// Builds an asset bundle from the selected objects in the project view,
// and changes the texture format using an AssetPostprocessor.
using UnityEngine;
using UnityEditor;
public class ExportAssetBundles {
// Store current texture format for the TextureProcessor.
public static TextureImporterFormat textureFormat;
[MenuItem("Assets/Build AssetBundle From Selection - PVRTC_RGB2")]
static void ExportResourceRGB2 () {
textureFormat = TextureImporterFormat.PVRTC_RGB2;
ExportResource();
}
[MenuItem("Assets/Build AssetBundle From Selection - PVRTC_RGB4")]
static void ExportResourceRGB4 () {
textureFormat = TextureImporterFormat.PVRTC_RGB4;
ExportResource();
}
static void ExportResource () {
// Bring up save panel.
string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d");
if (path.Length != 0) {
// Build the resource file from the active selection.
Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
foreach (object asset in selection) {
string assetPath = AssetDatabase.GetAssetPath((UnityEngine.Object) asset);
if (asset is Texture2D) {
// Force reimport thru TextureProcessor.
AssetDatabase.ImportAsset(assetPath);
}
}
BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets);
Selection.objects = selection;
}
}
}
// Changes the texture format when building the Asset Bundle.
using UnityEngine;
using UnityEditor;
public class TextureProcessor : AssetPostprocessor
{
void OnPreprocessTexture() {
TextureImporter importer = assetImporter as TextureImporter;
importer.textureFormat = ExportAssetBundles.textureFormat;
}
}
アセットは AssetDatabase.ImportAssetOptions を使用してインポートする方法をコントロールすることが出来ます。
テスト環境では,場合によっては変更点をテストするためにアセットバンドルをリビルドする必要が出てきます。こういう場合には,アセットバンドルをビルドする時, BuildAssetBundleOptions.UncompressedAssetBundle のオプションを使用することをおすすめします。これは高速にアセットバンドルを作成し,ロードも早くなりますがファイルサイズが大きくなりダウンロードに時間がかかってしまいます。
アセットバンドルを初めて使用するとき,前述の例の通りにマニュアルでビルドするので十分に見えます。しかしプロジェクトサイズが大きくなり,アセットの数が増加すると,このプロセスは効率的ではありません。より良いアプローチは,プロジェクトの全てのアセットバンドルをビルドする関数を記述することです。たとえばアセットファイルをアセットバンドルのファイルにマッピングするテキストファイルを使用できます。