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

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

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

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

  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.Load(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.Load(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.Load(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
    }
}

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