Version: 2022.2
言語: 日本語
アセットバンドル
アセットバンドル用のアセットの準備

アセットバンドルのワークフロー

AssetBundle (アセットバンドル) を使用するには、以下の手順で行います。各手順に関する詳細情報は、本セクションの他のページを参照してください。

ノート: このセクションでは、ビルトインの BuildPipeline.BuildAssetBundles() API を使用してアセットバンドルを作成する方法について説明します。推奨するよりユーザーフレンドリーな方法は、Addressables パッケージを使用する方法です。

アセットバンドルにアセットを割り当てる

AssetBundle (アセットバンドル) へのアセットの割り当ては、以下の手順で行います。

  1. Project ウィンドウから、バンドルに割り当てたいアセットを選択します。
  2. Inspector ウィンドウで該当オブジェクトを確認してください。
  3. Inspector ウィンドウの下部に、アセットバンドルとバリアントを割り当てるセクションがあります。左側のドロップダウンでアセットバンドルを割り当て、右側のドロップダウンでバリアントを割り当てます。
  4. 左側のドロップダウンで None をクリックすると、現在登録されているアセットバンドル名が表示されます。
  5. New をクリックして新しいアセットバンドルを作成します。
  6. 任意のアセットバンドル名を入力してください。アセットバンドル名によって、フォルダー構造を表現できます。サブフォルダーを加えるには、フォルダー名を / で区切ります。例えば、environment/forest というアセットバンドル名は、environment というサブフォルダー配下に forest という名前のバンドルを作成します。
  7. アセットバンドル名の選択または作成後、バリアント名の割り当てや作成を行いたい場合は、右側のドロップダウンメニューから同じ手順で行うことができます。バリアント名はアセットバンドルのビルドには必須ではありません。

ノート: Inspector で、プロジェクト内のフォルダーにアセットバンドルを割り当てることができます。デフォルトでは、そのフォルダー内のすべてのアセットが、同じアセットバンドルにフォルダーで割り当てられます。ただし、個々のアセットに対するアセットバンドルの割り当てが優先されます。

アセットバンドルを割り当てる上での各種方法についての詳細は、このドキュメンテーションの アセットバンドル用のアセットの準備 のページを参照してください。 。

アセットバンドルをビルドする 

Assets フォルダー内に Editor という名前のフォルダーを作成し、そのフォルダー内に、以下のスクリプトを置いてください。

using UnityEditor;
using System.IO;

public class CreateAssetBundles
{
    [MenuItem("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        string assetBundleDirectory = "Assets/AssetBundles";
        if(!Directory.Exists(assetBundleDirectory))
        {
            Directory.CreateDirectory(assetBundleDirectory);
        }
        BuildPipeline.BuildAssetBundles(assetBundleDirectory, 
                                        BuildAssetBundleOptions.None, 
                                        BuildTarget.StandaloneWindows);
    }
}

このスクリプトは、 アセット メニューの下部に Build AssetBundles というメニュー項目を作成し、そのタグに関連付けられた関数のコードを実行します 。 Build AssetBundles をクリックすると、プログレスバーがビルドダイアログとともに表示されます。これにより、AssetBundle 名でラベル付けしたすべてのアセットを取得し、assetBundleDirectory が定義するパスのフォルダーに置きます。

ノート: 上記で説明した Inspector ベースの方法を使用する代わりに、AssetBundlesのコンテンツをプログラムで定義することもできます。これは、AssetBundleBuild 構造体の配列を受け取る BuildPipeline.BuildAssetBundles のシグネチャを使用することで可能です。その場合、各バンドルのアセットのリストが渡され、Inspector で行われる AssetBundles への割り当ては無視されます。

詳細は、上の アセットバンドルをビルドする を参照してください。

アセットバンドルとアセットをロードする

ローカル ストレージからロードしたい場合は、以下のように AssetBundles.LoadFromFile APIを使用します。

public class LoadFromFileExample : MonoBehaviour {
    void Start() {
        var myLoadedAssetBundle 
            = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "myassetBundle"));
        if (myLoadedAssetBundle == null) {
            Debug.Log("Failed to load AssetBundle!");
            return;
        }
        var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("MyObject");
        Instantiate(prefab);
    }
}

LoadFromFile はバンドルファイルのパスを必要とします。

アセットバンドルがオンラインでホストされている場合、または直接的なファイルシステムアクセスをサポートしていないプラットフォームで実行されている場合は、UnityWebRequestAssetBundle API を使用してください。以下はその例です。

IEnumerator InstantiateObject()
{
    string url = "file:///" + Application.dataPath + "/AssetBundles/" + assetBundleName;        
    var request 
        = UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(url, 0);
    yield return request.Send();
    AssetBundle bundle = UnityEngine.Networking.DownloadHandlerAssetBundle.GetContent(request);
    GameObject cube = bundle.LoadAsset<GameObject>("Cube");
    GameObject sprite = bundle.LoadAsset<GameObject>("Sprite");
    Instantiate(cube);
    Instantiate(sprite);
}

GetAssetBundle(string, int) はアセットバンドルの場所の URL およびダウンロードしたいバンドルのバージョンを必要とします。この例ではローカルファイルを指していますが、string url はアセットバンドルがホスティングされている URL のどれでも指すことができます。

UnityWebRequestAssetBundle クラスにはアセットバンドルを処理するためのハンドル DownloadHandlerAssetBundle があり、リクエストからアセットバンドルを取得します。

使用するメソッドに関わらず、これでアセットバンドルオブジェクトが利用可能になりました。そのオブジェクトから LoadAsset<T>(string) を使用する必要があります。この LoadAsset<T>(string) は、ロードしようとしているアセットのタイプ T と、文字列 (string) としてバンドル内のオブジェクトの名前を必要とします。これは、アセットバンドルから読み込んでいるオブジェクトを、どんなものでも返します。この返されたオブジェクトは、Unity 上の他のオブジェクトと全く同じように使用できます。例えば、シーン内でゲームオブジェクトを作成したい場合は、単純に Instantiate(gameObjectFromAssetBundle) を呼び出すだけで行うことができます。

アセットバンドルをロードする API に関する詳細は、Unity ドキュメンテーションの アセットバンドルを使いこなす を参照してください。

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