转自:http://www.cnblogs.com/realtimepixels/p/3652128.html
2.assetbundle如果从WWW中被读取过一次,再读取会报错
当你把assetbundle资源用www下载下来后,往往都会使用“wwwResource.assetbundle”,但是注意,这个函数调用assetbundle的时候,只能调用一遍。意思是,当你要再次读取的时候,会报错。这时候,需要你写一套对于assetbundle的控制程序,保证第一次读取资源的时候是使用wwwResource.assetbundle,第二次再次利用,则要用已经读取出来的资源。
两个Bundle资源及依赖关系
BundleA->(dependencies)BundleB
BundleB
使用:
resMgr:LoadPrefab("BundleA", {}, function(objs) end)
resMgr:LoadPrefab("BundleB", {}, function(objs) end)
报错:can't be loaded because another AssetBundle with the same files is already loaded.
原因:OnLoadAssetBundle->
yield return StartCoroutine(OnLoadAssetBundle(depName, type));这次依赖下载没有进入request列表
在resMgr:LoadPrefab("BundleB" 进行了第二次bundle加载,导致重复bundle加载
解决:依赖加载时进入加载队列但是回调为空
IEnumerator OnLoadAssetBundle(string abName, Type type) {
string url = m_BaseDownloadingURL + abName;
List<LoadAssetRequest> requests = null;
if (!m_LoadRequests.TryGetValue(abName, out requests))
{
LoadAssetRequest request = new LoadAssetRequest();
request.assetType = null;
request.assetNames = new string[0]{};
request.luaFunc = null;
request.sharpFunc = null;
requests = new List<LoadAssetRequest>();
requests.Add(request);
m_LoadRequests.Add(abName, requests);
}
WWW download = null;
.........
//yield return StartCoroutine(OnLoadAssetBundle(depName, type));
yield return StartCoroutine(OnLoadAsset<GameObject>(depName)); //依赖加载不需要回调,类型无所谓