アセットバンドルの内部構造
アセットバンドルからのオブジェクトをロード、アンロード

アセットバンドルのダウンロード

このセクションではすでにアセットバンドルのビルド方法をすでに学んだことが前提となっています。まだであれば アセットバンドルのビルド を参照してください。

アセットバンドルをダウンロードする方法は二つあります。

  1. キャッシュなし: これは新しい WWW object を作成することでできます。アセットバンドルは、ローカルストレージデバイスの Unity の Cache フォルダーにキャッシュされません。
  2. キャッシュあり: これは WWW.LoadFromCacheOrDownload をコールします。アセットバンドルはローカルストレージデバイスの Unity の Cache フォルダーにキャッシュされます。WebPlayer の共有キャッシュは最大 50MB までのキャッシュされたアセットバンドルを共有できます。PC/Mac スタンドアロンのアプリケーションおよび iOS/Android アプリケーションは上限が 4GB です。専用キャッシュを使用する WebPlayer アプリケーションは、キャッシングのライセンス条項に指定されたバイト数が上限となります。他のプラットフォームについてはスクリプティングドキュメントを参照してください。

キャッシュなしのダウンロードのサンプルは次のとおりです。

using System;
using UnityEngine;
using System.Collections; class NonCachingLoadExample : MonoBehaviour {
   public string BundleURL;
   public string AssetName;
   IEnumerator Start() {
     // Download the file from the URL. It will not be saved in the Cache
     using (WWW www = new WWW(BundleURL)) {
         yield return www;
         if (www.error != null)
             throw new Exception("WWW download had an error:" + www.error);
         AssetBundle bundle = www.assetBundle;
         if (AssetName == "")
             Instantiate(bundle.mainAsset);
         else
             Instantiate(bundle.LoadAsset(AssetName));
                   // Unload the AssetBundles compressed contents to conserve memory
                   bundle.Unload(false);

     } // memory is freed from the web stream (www.Dispose() gets called implicitly)
   }
}

アセットバンドルをダウンロードする推奨の方法は WWW.LoadFromCacheOrDownload を使用することです。例えば、

using System;
using UnityEngine;
using System.Collections;

public class CachingLoadExample : MonoBehaviour {
    public string BundleURL;
    public string AssetName;
    public int version;

    void Start() {
        StartCoroutine (DownloadAndCache());
    }

    IEnumerator DownloadAndCache (){
        // Wait for the Caching system to be ready
        while (!Caching.ready)
            yield return null;

        // Load the AssetBundle file from Cache if it exists with the same version or download and store it in the cache
        using(WWW www = WWW.LoadFromCacheOrDownload (BundleURL, version)){
            yield return www;
            if (www.error != null)
                throw new Exception("WWW download had an error:" + www.error);
            AssetBundle bundle = www.assetBundle;
            if (AssetName == "")
                Instantiate(bundle.mainAsset);
            else
                Instantiate(bundle.LoadAsset(AssetName));
                    // Unload the AssetBundles compressed contents to conserve memory
                    bundle.Unload(false);

        } // memory is freed from the web stream (www.Dispose() gets called implicitly)
    }
}

.assetBundle プロパティーをアクセスするとき、ダウンロードされたデータは抽出されて AssetBundle オブジェクトが作成されます。この時点で、バンドルに含まれるオブジェクトをロードする準備ができています。LoadFromCacheOrDownload に渡す、二つ目の引数はどのアセットバンドルのバージョンをダウンロードするか指定します。もしアセットバンドルがキャッシュに存在しないか、リクエストよりも低いバージョンである場合、LoadFromCacheOrDownload によりアセットバンドルがダウンロードされます。そうでない場合アセットバンドルはキャッシュからロードされます。

WWW.LoadFromCacheOrDownload でアセットバンドルをダウンロードしたとき1 つの AssetBundle をダウンロードするまで 1 フレームで完了できることに注意してください。

すべて統合する

コンポーネントの準備が完了したので、アセットバンドルをロードして、シーンにコンテンツを表示するためにシーンをビルドできます。

最終的なプロジェクト構成
最終的なプロジェクト構成

最初に GameObject->CreateEmpty を選択して空のゲームオブジェクトを作成します。CachingLoadExample スクリプトをドラッグして作成したばかりの空のゲームオブジェクトにスクリプトをドラッグ&ドロップします。次にアセットバンドルの URL を BundleURL フィールドに入力します。プロジェクトのディレクトリにこれを配置するため、ファイルディレクトリのパスをコピーして、前に file:// を、例えば file://C:/UnityProjects/AssetBundlesGuide/Assets/AssetBundles/Cube.unity3d といったように付加します。

これでエディター上で再生すれば、キューブのプレハブががアセットバンドルからロードされるのが確認できます。

アセットバンドルをエディターでロード

エディターで作業をするときはアセットバンドルがビルドおよびロードされていることが必要で、開発プロセスを遅らせるかもしれません。例えば、アセットバンドルのアセットが修正されると、アセットバンドルが再ビルドされて本番環境では多くの場合にすべてのアセットバンドルが同時にビルドされて、結果としてひとつのアセットバンドルの更新を長い作業にします。よりよいアプローチでは、エディターに別のコードパスにより、アセットバンドルからロードする代わりにアセットを直接ロードします。これを実現するには Resources.LoadAssetAtPath を使用します(エディターのみ)。

// C# Example
// Loading an Asset from disk instead of loading from an AssetBundle
// when running in the Editor
using System.Collections;
using UnityEngine;

class LoadAssetFromAssetBundle : MonoBehaviour
{
    public Object Obj;

    public IEnumerator DownloadAssetBundle<T>(string asset, string url, int version) where T : Object {
        Obj = null;

#if UNITY_EDITOR
        Obj = Resources.LoadAssetAtPath("Assets/" + asset, typeof(T));
        yield return null;

#else
        // Wait for the Caching system to be ready
        while (!Caching.ready)
            yield return null;

        // Start the download
        using(WWW www = WWW.LoadFromCacheOrDownload (url, version)){
            yield return www;
            if (www.error != null)
                        throw new Exception("WWW download:" + www.error);
            AssetBundle assetBundle = www.assetBundle;
            Obj = assetBundle.LoadAsset(asset, typeof(T));
            // Unload the AssetBundles compressed contents to conserve memory
            bundle.Unload(false);

        } // memory is freed from the web stream (www.Dispose() gets called implicitly)

#endif
    }
}

アセットバンドルの内部構造
アセットバンドルからのオブジェクトをロード、アンロード