このセクションではすでにアセットバンドルのビルド方法をすでに学んだことが前提となっています。まだであれば アセットバンドルのビルド を参照してください。
アセットバンドルをダウンロードする方法は二つあります。
キャッシュなしのダウンロードのサンプルは次のとおりです。
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
}
}