このセクションではすでにアセットバンドルのビルド方法をすでに学んだことが前提となっています。まだであれば アセットバンドルのビルド を参照下さい。
アセットバンドルをダウンロードする方法は二つあります。
キャッシュなしのダウンロードのサンプルは次の通りです:
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フレームで完了できることに注意してください。
コンポーネントの準備が完了したので,アセットバンドルをロードして,シーンにコンテンツを表示するためにシーンをビルド出来ます。
最終的なプロジェクト構造
最初に 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
}
}