Unity 5 より前のバージョンの Unity では、アセットはエディタースクリプトを使用して選択し、バンドルに加えるしかありませんでした (Unity 5 では、エディターにツールを設けて、特定のバンドルにアセットを指定できるようになりました)。ここで説明する情報は、今、使用しているバージョンが Unity 4 だと仮定して、Unity 4 で古いプロジェクトの作業をしているユーザーのためのものです。
アセットバンドルを作成するには、BuildPipeline Editor クラスを使用する必要があります。Editor クラスを使用したすべてのスクリプトは、Editor と名付けたフォルダーに保存し、Assets フォルダー内のどこかに置く必要があります。以下は、C# のスクリプト例です。
// 古い Unity 4 の例。Unity 5 以降では使用できません
using UnityEngine;
using UnityEditor;
public class ExportAssetBundles {
[MenuItem("Assets/Build AssetBundle")]
static void ExportResource () {
string path = "Assets/myAssetBundle.unity3d";
Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path,
BuildAssetBundleOptions.CollectDependencies
| BuildAssetBundleOptions.CompleteAssets);
}
}
エディタースクリプトはゲームオブジェクトに適用される必要はありません。むしろ、Editor に使用されます。前出の例では「Build AssetBundle」という名のエディターの「Assets」メニューに、新しいアイテムを追加します。
このサンプルを使用するには、
BuildAssetBundle 関数は、AssetBundle を作成し指定した場所へ保存します。最初のパラメーターは mainAsset を指定します。mainAsset は特別なアセットで、Assets を AssetBundle から読み込むとき、mainAsset プロパティーと一緒に直接取得されます。mainAsset を設定するのは強制ではないので、使用しない場合は、パラメーターに null を置くことができます。2番目のパラメーターは、AssetBundle のディスク上の保存場所です。最後のパラメーターは、AssetBundles をビルドするときに使用するビルドフラッグかオプションです。BuildAssetBundleOptions は、ビットワイズか演算子を使用して連結することができます。
アセットバンドルのビルドはパブリッシュ前のステップであり、一つの関数コールによって一回のみ発生し、例えば、メニューアイテムによってすべてのアセットバンドルをビルドします。アプリケーションを開発するとき、ヘルパー関数を記述すべきであり、ターゲットプラットフォームですべてのアセットバンドルを、シングルクリックまたはバッチモードでユーザーによるアクションなく、ビルドします。
アセットバンドルのビルドに使用できるクラスメソッドは 3 つあります。
BuildPipeline.BuildAssetBundle により、どんな種類のアセットでもアセットバンドルをビルドできます。
BuildPipeline.BuildStreamedSceneAssetBundle は、データが利用可能となったときにシーンのストリーミングや読み込みがしたい場合に使用します。
BuildPipeline.BuildAssetBundleExplicitAssetNames は BuildPipeline.BuildAssetBundle とほぼ同様ですが、追加の引数によって各オブジェクトに対応したカスタム文字列の識別子(名前)を指定できます。
アセットバンドルのビルドはエディターのスクリプティングを通じて行います。BuildPipeline.BuildAssetBundle のスクリプティングドキュメントにこの基本的な例があります。
このサンプルを実行するために、上記のリンクから ExportAssetBundles という名前の C# スクリプトにコピー&ペーストします。このスクリプトを Editor という名前のフォルダーに配置して Unity Editor で動作するようにします。
次に Assets メニューから、2つのメニューオプションが表示されます。
Build AssetBundle From Selection - Track dependencies。(選択範囲からからビルド - 依存関係をトラッキング)。これにより現在のオブジェクトからアセットバンドルをビルドし、すべての依存関係が含まれます。例えば、プレハブがいくつかの階層レイヤーから構成される場合、再帰的にすべての子オブジェクトとコンポーネントを追加します。
Build AssetBundle From Selection - No dependency tracking。(選択範囲からからビルド - 依存関係をトラッキングしない)。これは前述の手法の反対のオプションであり、選択範囲のアセットのみを単独で含みます。
この例では、新規のプレハブを作成すべきです。最初に新規のキューブを作成するために GameObject > 3D Object > Cube を選択すると、階層ビューに新規のキューブが作成されます。次にキューブをヒエラルキービューからプロジェクトビューにドラッグ&ドロップして、オブジェクトのプレハブが作成されます。
プロジェクトのキューブのプレハブを右クリックして Build AssetBundle From Selection - Track dependencies を選択します。 こうすると、バンドルアセットを保存するウィンドウが表示されます。もし “AssetBundles” という新規のフォルダーを作成して、キューブを Cube.unity3d として保存すると、プロジェクトウィンドウは次のようになります。
この時点で、アセットバンドルの Cube.unity3d をローカルのストレージまたは好きなサーバーにアップロードすることができます。
AssetDatabase.ImportAsset を使用して、BuildPipeline.BuildAssetBundle をコールする直前にアセットの再インポートを強制的に行い、さらに AssetPostprocessor.OnPreprocessTexture を使用することで必要なプロパティーをセットすることができます。次にサンプルにより、アセットバンドルをビルドする際に、さまざまなテクスチャ圧縮方式をセットする方法を確認できます。
// Legacy Unity 4 example. Not for use in Unity 5 & onwards.
// 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;
}
}
}
// 古い Unity 4 の例。Unity 5 以降では使用できません。
// アセットバンドルをビルドするときにテクスチャ形式を変更します。
using UnityEngine;
using UnityEditor;
public class TextureProcessor : AssetPostprocessor
{
void OnPreprocessTexture() {
TextureImporter importer = assetImporter as TextureImporter;
importer.textureFormat = ExportAssetBundles.textureFormat;
}
}
アセットは AssetDatabase.ImportAssetOptions を使用してインポートする方法を制御することができます。
テスト環境では AssetBundles の再ビルドを余儀なくするようなテストが必要な場合があります。このような場合は AssetBundles をビルドするとき、オプション BuildAssetBundleOptions.UncompressedAssetBundle を使用することを推奨します。これにより、AssetBundles をビルド、ロードするのが早くなります。ただし、サイズが大きくなるので、ダウンロードに時間がかかります。
最初にアセットバンドルを使用するとき、前出の例のように、手動で十分ビルドできるように見えるかもしれません。しかし、プロジェクトのサイズが大きくなり、アセット数が増加するにつれ、手動でこれを行うのは非効率になります。改善策は、プロジェクトのアセットバンドルすべてをビルドする関数を書くことです。例えば、アセットファイルをアセットバンドルファイルにマップするテキストファイルを使用することができます。