Version: 2020.1
言語: 日本語
古いアセットバンドル
Unity 4 におけるアセットの依存関係の管理

Unity 4 でのアセットバンドルの作成

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」メニューに、新しいアイテムを追加します。

このサンプルを使用するには、

  • C# スクリプトを作成し ExportAssetBundles.cs という名前にして、プロジェクトビューの Editor と名前のついたフォルダーに保存します。 アセットやプロジェクトフォルダー内のアセットを選択して内部にアセットバンドルを作成します。
  • Build AssetBundle を Assets メニューから選択します。「Save」をクリックし、AssetBundle を作成します。
  • ExportResource 関数の最初の行でアセットバンドルのパスを設定します。
  • 次の行で、プロジェクトウィンドウでオブジェクトを選択して選択したものを、アセットバンドルにします。

BuildAssetBundle 関数は、AssetBundle を作成し指定した場所へ保存します。最初のパラメーターは mainAsset を指定します。mainAsset は特別なアセットで、Assets を AssetBundle から読み込むとき、mainAsset プロパティと一緒に直接取得されます。mainAsset を設定するのは強制ではないので、使用しない場合は、パラメーターに null を置くことができます。2番目のパラメーターは、AssetBundle のディスク上の保存場所です。最後のパラメーターは、AssetBundles をビルドするときに使用するビルドフラッグかオプションです。BuildAssetBundleOptions は、ビットワイズか演算子を使用して連結することができます。

アセットバンドルのビルドはパブリッシュ前のステップであり、一つの関数コールによって一回のみ発生し、例えば、メニューアイテムによってすべてのアセットバンドルをビルドします。アプリケーションを開発するとき、ヘルパー関数を記述すべきであり、ターゲットプラットフォームですべてのアセットバンドルを、シングルクリックまたはバッチモードでユーザーによるアクションなく、ビルドします。

アセットバンドルのビルドに使用できるクラスメソッドは 3 つあります。

アセットバンドルをビルドする方法のサンプル

アセットバンドルのビルドはエディターのスクリプティングを通じて行います。BuildPipeline.BuildAssetBundle のスクリプティングドキュメントにこの基本的な例があります。

このサンプルを実行するために、上記のリンクから ExportAssetBundles という名前の C# スクリプトにコピー&ペーストします。このスクリプトを Editor という名前のフォルダーに配置して Unity Editor で動作するようにします。

次に Assets メニューから、2つのメニューオプションが表示されます。

  1. Build AssetBundle From Selection - Track dependencies。(選択範囲からからビルド - 依存関係をトラッキング)。これにより現在のオブジェクトからアセットバンドルをビルドし、すべての依存関係が含まれます。例えば、プレハブがいくつかの階層レイヤーから構成される場合、再帰的にすべての子オブジェクトとコンポーネントを追加します。

  2. 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 を使用することで必要なプロパティをセットすることができます。次にサンプルにより、アセットバンドルをビルドする際に、さまざまなテクスチャ圧縮方式をセットする方法を確認できます。

// 古い Unity 4 の例。 Unity 5 以降には使用できません。
// プロジェクトビューで選択したオブジェクトからアセットバンドルを作成します。
// それから、AssetPostprocessor を使ってテクスチャ形式を変更します。

using UnityEngine;
using UnityEditor;

public class ExportAssetBundles {
    
    //  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 () {
        // Save panel を取り出す。
        string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d");
        
        if (path.Length != 0) {
            // アクティブな選択からリソースファイルを作ります。
            Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);
            
            foreach (object asset in selection) {
                string assetPath = AssetDatabase.GetAssetPath((UnityEngine.Object) asset);
                if (asset is Texture2D) {
                    // 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 をビルド、ロードするのが早くなります。ただし、サイズが大きくなるので、ダウンロードに時間がかかります。

本番環境のためのアセットバンドルビルド

最初にアセットバンドルを使用するとき、前出の例のように、手動で十分ビルドできるように見えるかもしれません。しかし、プロジェクトのサイズが大きくなり、アセット数が増加するにつれ、手動でこれを行うのは非効率になります。改善策は、プロジェクトのアセットバンドルすべてをビルドする関数を書くことです。例えば、アセットファイルをアセットバンドルファイルにマップするテキストファイルを使用することができます。

古いアセットバンドル
Unity 4 におけるアセットの依存関係の管理