|
统一只会让你有一个特定的资源包加载到应用程序的一个时间的一个实例。这意味着你不能如果同样一个已加载先前没有被卸载从WWW检索对象的资源包。在实践上,它意味着当你试图访问一个以前加载资源包这样:
AssetBundle bundle = www.assetBundle;
以下将出现错误
无法加载缓存的资源包。一个同名文件已经从另一个资源包加载
与相关属性将返回null。既然你不能取回资源包二下载过程中如果第一个还装,你需要做的是卸载当你不再使用它的资源,或保持对它的引用,避免下载它如果它已经在记忆。你可以根据你的需要正确的行动,但我们的建议是,你卸载AssetBundle只要你完成加载对象。这将释放内存,你将不再得到加载缓存的资源包错误。
请注意,在Unity 5束将完成加载之前任何的束将卸下。所以调用AssetBundle.Unload。卸载功能有些捆正在加载将阻止其它的代码的执行直到所有文件加载。这将添加一个性能问题。这已经重新统一5。
如果你想保持你的下载资源,你可以使用一个封装类来帮助你管理你的下载如下:
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
static public class AssetBundleManager {
// A dictionary to hold the AssetBundle references
static private Dictionary<string, AssetBundleRef> dictAssetBundleRefs;
static AssetBundleManager (){
dictAssetBundleRefs = new Dictionary<string, AssetBundleRef>();
}
// Class with the AssetBundle reference, url and version
private class AssetBundleRef {
public AssetBundle assetBundle = null;
public int version;
public string url;
public AssetBundleRef(string strUrlIn, int intVersionIn) {
url = strUrlIn;
version = intVersionIn;
}
};
// Get an AssetBundle
public static AssetBundle getAssetBundle (string url, int version){
string keyName = url + version.ToString();
AssetBundleRef abRef;
if (dictAssetBundleRefs.TryGetValue(keyName, out abRef))
return abRef.assetBundle;
else
return null;
}
// Download an AssetBundle
public static IEnumerator downloadAssetBundle (string url, int version){
string keyName = url + version.ToString();
if (dictAssetBundleRefs.ContainsKey(keyName))
yield return null;
else {
while (!Caching.ready)
yield return null;
using(WWW www = WWW.LoadFromCacheOrDownload (url, version)){
yield return www;
if (www.error != null)
throw new Exception("WWW download:" + www.error);
AssetBundleRef abRef = new AssetBundleRef (url, version);
abRef.assetBundle = www.assetBundle;
dictAssetBundleRefs.Add (keyName, abRef);
}
}
}
// Unload an AssetBundle
public static void Unload (string url, int version, bool allObjects){
string keyName = url + version.ToString();
AssetBundleRef abRef;
if (dictAssetBundleRefs.TryGetValue(keyName, out abRef)){
abRef.assetBundle.Unload (allObjects);
abRef.assetBundle = null;
dictAssetBundleRefs.Remove(keyName);
}
}
}
类的一个实例将:
using UnityEditor;
class ManagedAssetBundleExample : MonoBehaviour {
public string url;
public int version;
AssetBundle bundle;
void OnGUI (){
if (GUILayout.Label ("Download bundle"){
bundle = AssetBundleManager.getAssetBundle (url, version);
if(!bundle)
StartCoroutine (DownloadAB());
}
}
IEnumerator DownloadAB (){
yield return StartCoroutine(AssetBundleManager.downloadAssetBundle (url, version));
bundle = AssetBundleManager.getAssetBundle (url, version);
}
void OnDisable (){
AssetBundleManager.Unload (url, version);
}
}
请记住,这个例子在assetbundlemanager类是静态的,和任何资源,你引用不会破坏加载新场景的时候。使用这个类作为指导,但建议最初最好是卸载他们一直在使用中对后。你总是可以克隆一个预先实例化的对象,除需要加载资源包了。
|
|