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

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

Important note: The AssetBundle Manager is deprecated for Unity versions 2018.2 and higher. It is no longer available from the Asset Store, but you can still download it from the AssetBundleDemo Bitbucket repository. If you use Unity version 2018.2 or higher, see documentation for Addressable Assets.

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

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

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

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

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

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

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);
    }
}

このスクリプトは、 Assets メニューの下部に “Build AssetBundles” というメニューアイテムを作成します。このメニューアイテムは、コードを、そのタグに関連付けられた関数内で実行します。 Build AssetBundles をクリックすると、ビルドダイアログとともにプログレスバーが表示されます。これが、ある特定のアセットバンドル名でラベル付けされたアセットの全てを取得し、assetBundleDirectory によって定義されたパスにある 1 つのフォルダー内にそれらを配置します。

このコードの機能についての詳細は、Unity ドキュメンテーションの アセットバンドルのビルド を参照してください。

オフサイトストレージにアセットバンドルをアップロードする

この手順はユーザーごとに異なります。サードパーティのホスティングサイトにアセットバンドルをアップロードする場合は、この時点で行ってください。ローカルに限定した開発を行っている場合で、全てのアセットバンドルをディスク上に置く場合は、この手順は飛ばして次の手順に進んでください。

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

ローカルストレージからロードする場合は、 AssetBundles.LoadFromFile API を使用できます。以下はその例です。

public class LoadFromFileExample extends MonoBehaviour {
    function 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 はバンドルファイルのパスを必要とします。

アセットバンドルを独自にホスティングしていて、それをゲームにダウンロードする必要がある場合は、 UnityWebRequest API を使用できます。以下はその使用例です。

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

GetAssetBundle(string, int) takes the URL of the location of the AssetBundle and the version of the bundle you want to download. In this example we’re still pointing to a local file but string url could point to any URL you have your AssetBundles hosted at.

UnityWebRequest はアセットバンドルを扱うためのハンドルである DownloadHandlerAssetBundle を持っています。これがリクエストからアセットバンドルを取得します。

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

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


  • 2017–05–15 Page published
アセットバンドル
アセットバンドル用のアセットの準備