/// <summary> /// 根据依赖递归加载所有依赖资源,再加载主资源 android不能用 /// </summary> private IEnumerator _LoadRecursively(string assetName, ABCallback callback, bool canUnload) { assetName = assetName.ToLower(); if (manifest == null) { yield return(StartCoroutine(GetAssetBundleManifest())); } if (manifest != null) { string[] allDependencies = GetAssetBundleDependencies(assetName); for (int i = 0; i < allDependencies.Length; i++) { StartCoroutine(_LoadRecursively(allDependencies[i], null, canUnload)); } } //已加载 ABInfo abInfo; if (mAssetBundles.TryGetValue(assetName, out abInfo)) { abInfo.canUnload = abInfo.canUnload && canUnload; if (callback != null) { callback(abInfo.ab); } } else { AssetBundle assetBundle = AssetBundle.LoadFromFile(PathUtils.ABPath + assetName); if (assetBundle != null) { assetBundle.LoadAllAssets(); abInfo = new ABInfo(); abInfo.path = assetName; abInfo.canUnload = canUnload; abInfo.ab = assetBundle; mAssetBundles.Set(assetName, abInfo); if (callback != null) { callback(abInfo.ab); } } else { } } }
/// <summary> /// 只通过ab路径加载路径,加载结束放入缓存,callback /// </summary> public Coroutine LoadAB(string abPath, ABCallback callback = null, bool canAutoUnload = true) { return(StartCoroutine(_LoadAB(abPath, callback, canAutoUnload))); }
private IEnumerator _LoadAB(string abPath, ABCallback callback, bool canUnload) { Logger.Log("_LoadAB:" + abPath); if (abPath == null) { yield return(null); } abPath = abPath.ToLower(); if (manifest == null) { yield return(StartCoroutine(GetAssetBundleManifest())); } if (manifest != null) { string[] allDependencies = GetAssetBundleDependencies(abPath); for (int i = 0; i < allDependencies.Length; i++) { yield return(StartCoroutine(_LoadAB(allDependencies[i], null, canUnload))); } } ABInfo abInfo; if (mAssetBundles.TryGetValue(abPath, out abInfo)) { abInfo.canUnload = abInfo.canUnload && canUnload; if (callback != null) { callback(abInfo.ab); } yield break; } if (mLoading.Contains(abPath)) { while (mLoading.Contains(abPath)) { yield return(null); } if (mAssetBundles.TryGetValue(abPath, out abInfo)) { abInfo.canUnload = abInfo.canUnload && canUnload; if (callback != null) { callback(abInfo.ab); } } } else { string resPath = PathUtils.LoadABPath + abPath.ToLower(); mLoading.Add(abPath); Logger.Log("_LoadAB resPath:" + resPath); WWW www = new WWW(resPath); yield return(www); mLoading.Remove(abPath); if (www != null && string.IsNullOrEmpty(www.error)) { www.assetBundle.LoadAllAssets(); abInfo = new ABInfo(); abInfo.path = abPath; abInfo.canUnload = canUnload; abInfo.ab = www.assetBundle; mAssetBundles.Set(abPath, abInfo); if (callback != null) { callback(abInfo.ab); } } else { Logger.LogError("ResMgr load " + abPath + " failed:" + www.error); } } }