Для понимания этого раздела, нужно чтобы вы уже освоили процесс сборки Asset Bundles. Если вы этого еще не сделали, тогда, пожалуйста, ознакомьтесь со следующим материалом: Сборка AssetBundles
Есть два способа скачивания AssetBundle
Ниже приведен пример скачивания без кэширования
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)
}
}
Рекомендуется скачивать AssetBundles с помощью 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. Теперь вы готовы к тому, чтобы загрузить объекты, содержащиеся в AssetBundle. Второй параметр, который передается LoadFromCacheOrDownload, указывает какую версию AssetBundle нужно скачать. Если AssetBundle нет в кэше или версия ниже запрашиваемой, LoadFromCacheOrDownload скачает AssetBundle, в противном случае AssetBundle будет загружен из кэша.
Please note that only up to one AssetBundle download can finish per frame when they are downloaded with WWW.LoadFromCacheOrDownload.
Теперь, когда все компоненты на своих местах, вы можете создать сборку сцены, которая позволит загрузить AssetBundle и вывести контент на экран.
Сначала создайте пустой игровой объект, для этого переходим по file://
, например,file://C:/UnityProjects/AssetBundlesGuide/Assets/AssetBundles/Cube.unity3d
Теперь нажав на кнопку play в Редакторе, вы должны увидеть, как префаб Cube загружается из AssetBundle
Работая в редакторе, сборка AssetBundles и их загрузка, могут замедлить процесс разработки. К примеру, если Ассет из AssetBundle был изменен, это повлечет за собой необходимость новой сборки этого AssetBundle. А в рабочей среде, скорее всего, все сборки AssetBundles происходят вместе, делая обновление одного AssetBundle довольно длительным процессом. Лучший подход - это загружать необходимые Ассеты напрямую с диска, нежели через AssetBundles. Для этого можно использовать 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
}
}