void AddLoadBundleTask(string assetName, GTResourceBundle bundle, GTResourceTask parentTask, System.Action <Object> callback) { GTResourceTask task = new GTResourceTask(); task.Bundle = bundle; task.LoadedDepCount = 0; task.Parent = parentTask; task.AssetName = assetName; task.AssetCallback = callback; GTCoroutinueManager.Instance.StartCoroutine(LoadAsyncBundle(task)); }
IEnumerator LoadAsyncBundle(GTResourceTask task) { GTResourceBundle taskBundle = task.Bundle; AssetBundle ab = null; if (taskBundle.State >= GTResourceBundle.TYPE_LOADING) { while (taskBundle.State != GTResourceBundle.TYPE_LOADED) { yield return(null); } ab = taskBundle.AB; } else { taskBundle.State = GTResourceBundle.TYPE_LOADING; string url = string.Format("{0}{1}/{2}", WWWPath, BundlePPath, taskBundle.AssetBundleName); WWW www = new WWW(url); yield return(www); if (!string.IsNullOrEmpty(www.error)) { Debug.LogError(www.error); yield break; } ab = www.assetBundle; taskBundle.State = GTResourceBundle.TYPE_LOADED; taskBundle.AB = ab; www.Dispose(); } for (int i = 0; i < taskBundle.Deps.Count; i++) { string depAbName = taskBundle.Deps[i]; GTResourceBundle dpBundle = null; Bundles.TryGetValue(depAbName, out dpBundle); if (dpBundle == null) { continue; } AddLoadBundleTask(null, dpBundle, task, null); } if (task.Parent != null) { task.Parent.LoadedDepCount++; } while (task.LoadedDepCount < taskBundle.Deps.Count) { yield return(null); } AssetBundleRequest req = null; if (task.AssetName != null) { req = ab.LoadAssetAsync <Object>(task.AssetName); while (!req.isDone) { yield return(null); } } if (req != null) { if (req.asset == null) { Debug.LogError(ab); yield break; } if (task.AssetCallback != null) { task.AssetCallback.Invoke(req.asset); } } yield return(0); }