AssetBundleLoader LoadBundleAndDepAsyncImpl(string bundleName, bool hold) { AssetBundleLoader abLoader; if (loaders.TryGetValue(bundleName, out abLoader)) { return(abLoader); } string[] deps = manifest.GetDirectDependencies(bundleName); foreach (var dep in deps) { //递归加载Loader LoadBundleAndDepAsyncImpl(dep, false); } //创建 abLoader = new AssetBundleLoader { bundleName = bundleName, bundleFullPath = ResourceUtils.FullPathForAssetBundleApi(FilePath(bundleName)), waitDepCount = deps.Length, hold = hold, }; foreach (var dep in deps) { var deplo = loaders[dep]; if (deplo.IsComplete) { abLoader.DepComplete(deplo.state == AssetBundleLoader.State.Error); } else { deplo.OnComplete += abLoader.DepComplete; } } Debug.Assert(!loaders.ContainsKey(bundleName), "AssetBundleLoader exists."); loaders[bundleName] = abLoader; StartCoroutine(abLoader.LoadAsync()); return(abLoader); }
AssetBundleLoader LoadBundleAndDepImpl(string bundleName, bool hold) { AssetBundleLoader abLoader; if (loaders.TryGetValue(bundleName, out abLoader)) { return(abLoader); } string[] deps = manifest.GetDirectDependencies(bundleName); foreach (var dep in deps) { //递归加载Loader LoadBundleAndDepImpl(dep, false); } //创建 abLoader = new AssetBundleLoader { bundleName = bundleName, bundleFullPath = ResourceUtils.FullPathForAssetBundleApi(FilePath(bundleName)), waitDepCount = deps.Length, hold = hold, }; bool isAyncCollision = false; foreach (var dep in deps) { AssetBundleLoader deplo; if (loaders.TryGetValue(dep, out deplo)) { if (deplo.IsComplete) { abLoader.DepComplete(deplo.state == AssetBundleLoader.State.Error); } else { Debug.Assert(deplo.state == AssetBundleLoader.State.Loading, "AssetBundleLoader must be loading"); Debug.LogError(string.Format("AssetBundleLoader '{0}' is loading aync, CANNOT load sync!", dep)); isAyncCollision = true; } } else { isAyncCollision = true; } } //异步冲突导致的错误, 就不要加入管理器. 这样可以确保下次可以正常被加载 if (isAyncCollision) { return(null); } Debug.Assert(!loaders.ContainsKey(bundleName), "AssetBundleLoader exists."); loaders[bundleName] = abLoader; abLoader.Load(); Debug.Assert(abLoader.IsComplete, "AssetBundleLoader load sync must complete"); return(abLoader); }