//加载Bundle的依赖资源清单
private IEnumerator LoadAssetbundleManifest(Action<bool> action)
{
if (_assetBundleManifest != null)
{
if (action != null)
action(true);
}
else
{
//依赖资源的名字和平台的名字一样加载时直接得到平台名称就可以了
string path = GameManager.Instance.GetFileFullPath(MiscUtils.GetCurrentPlatform() + "/" + MiscUtils.GetCurrentPlatform());
WWW www = new WWW(path);
yield return www;
if (www.isDone && www.error == null)
{
if (_assetBundleManifest != null)
_assetBundleManifest = null;
_assetBundleManifest = (AssetBundleManifest)www.assetBundle.LoadAsset("assetbundlemanifest");
www.assetBundle.Unload(false);
if (action != null)
action(true);
}
else
{
if (action != null)
action(false);
UIUtils.LogError("加载列表清单失败");
}
}
}
加载依赖资源和平时使用加载差不多,只是需要记录加载的次数,
/// <summary>
/// 加载依赖资源
/// </summary>
/// <param name="pathName"></param>
public void LoadDependenciesBundle(string pathName)
{
if (_assetBundleManifest == null) {
if (!bundelManifestName.Contains(pathName))
bundelManifestName.Add(pathName);
//Debug.LogError("依赖加载清单是空的");
return;
}
if (bundelManifestName.Contains(pathName))
bundelManifestName.Remove(pathName);
string[] manifestName = _assetBundleManifest.GetAllDependencies(pathName);
for (int i = 0; i < manifestName.Length; ++i)
{
//加载的资源列表和已加载好的资源中存在该资源则不再加载该资源
if (_loadAssetBundle.ContainsKey(manifestName[i]) || GetHaveWWWBundle(manifestName[i]))
{
if (_loadAssetBundle.ContainsKey(manifestName[i]))
_loadAssetBundle[manifestName[i]].count += 1;
else
{
AssetBundleData ab = new AssetBundleData();
_loadAssetBundle.Add(manifestName[i], new AssetBundleData() { count = 1, });
}
continue;
}
string manifestPath = GameManager.Instance.GetFileFullPath(MiscUtils.GetCurrentPlatform() + "/" + manifestName[i]);
//异步加载的bundle
LoadAssetBundle loadManifestBundle = new LoadAssetBundle();
loadManifestBundle.www = new WWW(manifestPath);
loadManifestBundle.path = manifestPath;
loadManifestBundle.key = manifestName[i];
//添加到下载列表
www.Add(loadManifestBundle);
}
}
/// <summary>
/// 卸载资源
/// </summary>
/// <param name="name"></param>
/// <param name="pathName"></param>
public void UnLoadAssetBundle(string pathName)
{
pathName = pathName.ToLower();
//卸载资源
if (_loadAssetBundle.ContainsKey(pathName))
{//
//Debug.LogError("卸载的依赖资源:" + pathName);
_loadAssetBundle[pathName].count -= 1;
if (_loadAssetBundle[pathName].count <= 0)
{
_loadAssetBundle[pathName].assetBundle.Unload(true);
_loadAssetBundle.Remove(pathName);
}
}
}
有时候游戏中需要动态更新资源,下载好之后要及时更新资源,如果加载了正在更新的资源需要Unload,(Unload(true)这里不能使用,IOS下会可能崩掉)
/// <summary>
/// 检测更新资源包
/// </summary>
/// <param name="pathName"></param>
/// <returns></returns>
public bool CheckLoadAssetBundle(string pathName)
{
if (_loadAssetBundle == null)
return false;
pathName = pathName.ToLower();
//卸载资源
foreach (string key in _loadAssetBundle.Keys)
{
if (pathName.Contains(key))
{
UIUtils.LogError("检测更新资源包:" + key + "***********" + pathName);
_loadAssetBundle[key].assetBundle.Unload(false);
_loadAssetBundle.Remove(key);
return true;
}
}
return false;
}
//更新Bundle
private void UpdateBundle()
{
if (www != null)
{
//异步加载资源
for (int i = 0; i < www.Count; ++i)
{
if (www[i].www.error != null)
{
UIUtils.LogError("www加载资源错误" + www[i].key);
www.Remove(www[i]);
}
else if (www[i].www.isDone)
{
//Debug.LogError("www加载资源:" + www[i].key);
if (!_loadAssetBundle.ContainsKey(www[i].key))
{
_loadAssetBundle[www[i].key] = new AssetBundleData() { assetBundle = www[i].www.assetBundle, count = 1};
}
else
{
if (_loadAssetBundle[www[i].key].assetBundle == null)
_loadAssetBundle[www[i].key].assetBundle = www[i].www.assetBundle;
_loadAssetBundle[www[i].key].count += 1;
}
www.Remove(www[i]);
}
//else
// ++i;
}
//有未加载资源
}
if (bundelManifestName != null && _assetBundleManifest != null)
{
while(bundelManifestName.Count > 0)
LoadDependenciesBundle(bundelManifestName[0]);
}
}