/// <summary> /// 加载 AB 包 /// </summary> /// <param name="abName">AB包名称</param> /// <returns></returns> public IEnumerator LoadAssetBundle(string abName) { // AB包关系的建立 if (!_DicABRelation.ContainsKey(abName)) { ABRelation tmpABrelation = new ABRelation(abName); _DicABRelation.Add(abName, tmpABrelation); } ABRelation abRelation = _DicABRelation[abName]; // 得到指定AB包的依赖引用关系 string[] strDenendence = ABManifestLoader.GetInstance().RetrivalDependce(abName); // 相同的包名在添加 依赖和引用项时 内部会做一个判断:查看是否添加过,添加过就不再添加了 foreach (string item in strDenendence) { // 添加 “依赖项” abRelation.AddDenpendce(item); // 添加 “引用项” yield return(LoadReference(item, abName)); } //加载AB包 if (!_DicSingleABLoaderCache.ContainsKey(abName)) { _CurrentSingleABLoader = new SingleABLoader(abName, CompleteLoadAB); _DicSingleABLoaderCache.Add(abName, _CurrentSingleABLoader); yield return(_DicSingleABLoaderCache[abName].LoadAssetBundle()); } }
/// <summary> /// 获取本类实例 /// </summary> /// <returns></returns> public static ABManifestLoader GetInstance() { if (_Instance == null) { _Instance = new ABManifestLoader(); } return(_Instance); }
/// <summary> /// 加载指定场景,指定包 /// </summary> /// <param name="sceneName">场景名称</param> /// <param name="abName">assetBundle 名称</param> /// <param name="loadAllCompleteHandle">制定的AB包加载完成之后,执行的方法</param> /// <returns></returns> public IEnumerator LoadAssetBundlePack(string sceneName, string abName, DelLoadComplete loadAllCompleteHandle) { if (_Instance == null) { yield break; } // 参数检查 if (string.IsNullOrEmpty(sceneName) || string.IsNullOrEmpty(abName) || loadAllCompleteHandle == null) { Debug.LogError(GetType() + "/LoadAssetBundlePack()/sceneName or abName or loadAllCompleteHandle =null"); yield break; } if (!abName.Contains(".")) { Debug.LogError(GetType() + "/LoadAssetBundlePack()/ abName需要有后缀的(.ab或.scene)"); } // 规范化参数 string _CurrentSceneName = sceneName.ToLower(); string _CurrentAB = String.Empty; if (abName.Contains("/")) { _CurrentAB = abName.ToLower(); } else { _CurrentAB = _CurrentSceneName + "/" + abName.ToLower(); } // 等待Manifest清单文件加载完成 while (!ABManifestLoader.GetInstance().IsLoadFinish) { yield return(null); } _ManifestObj = ABManifestLoader.GetInstance().GetABManifest(); if (_ManifestObj == null) { Debug.LogError(GetType() + "/LoadAssetBundlePack()/_ManifestObj =null"); yield break; } // 把当前场景加入集合 if (!_DicAllScenes.ContainsKey(_CurrentSceneName)) { MultiABManager multiMgrObj = new MultiABManager(_CurrentSceneName); _DicAllScenes.Add(_CurrentSceneName, multiMgrObj); } // 调用下一层(MultiABManager) MultiABManager tmpMultiAbManager = _DicAllScenes[_CurrentSceneName]; if (tmpMultiAbManager == null) { Debug.LogError(GetType() + "/LoadAssetBundlePack()/tmpMultiAbManager=null"); yield break; } else { tmpMultiAbManager.SetCurrentABNameAndHandler(_CurrentAB, loadAllCompleteHandle); // 调用“多包管理类”来加载指定AB包 yield return(tmpMultiAbManager.LoadAssetBundle(_CurrentAB)); } }
void Awake() { StartCoroutine(ABManifestLoader.GetInstance().LoadManifestFile()); }