/// <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> /// 添加引用项 /// 作用:当两个包相互依赖时,光靠依赖关系,无法终止遍历, /// 这里通过增加引用关系,来终止死循环。 /// 例如:A、B两包, A包先加载,添加B包为依赖项,B包将A包添加为引用项,然后加载B包 /// 此时,B包添加A包为依赖项,并且A包添加B包为引用项,由于A包已经添加过引用关系,所以不再加载B包,从而避免了循环 /// 总结:实际上,只需要一个有包名的列表就可以了,加载过的包名不在加载,就可以了,这里的引用的依赖包关系,没有用到 /// </summary> private IEnumerator LoadReference(string abName, string refAbName) { // 表示: 该 AB 包的引用包,已经加载过了,就不在加载,只需要添加到引用关系中 if (_DicABRelation.ContainsKey(abName)) { ABRelation tmpABRelation = _DicABRelation[abName]; // 添加 AB 包的引用关系 tmpABRelation.AddReference(refAbName); } else { ABRelation tmpABRelation = new ABRelation(abName); tmpABRelation.AddReference(refAbName); _DicABRelation.Add(abName, tmpABRelation); yield return(LoadAssetBundle(abName)); } }