/// <summary> /// 释放ab包的接口,所以AB包释放都调用这个方法 /// </summary> /// <param name="abName"></param> public void DisposeAssetBundle(string abName) { AssetBundleItem bundleItem = null; _AssetBundleDic.TryGetValue(abName, out bundleItem); // 加载完的AB包才能卸载 if (bundleItem != null && bundleItem.BundleLoadStatus == BundleLoadStatus.LOADED) { //不在常驻内存列表的AB包才能卸载 if (abPermanentAsset == null || !abPermanentAsset.BundleNameHS.Contains(abName)) { ABRelation abRelation = bundleItem.abRelation; // 没有被别的包依赖才可以进行卸载 if (abRelation.GetAllReference().Count == 0) { bundleItem.Dispose(); // 卸载目标ab包 _AssetBundleDic.Remove(abName); List <string> dependenceList = abRelation.GetAllDependence(); // 获取目标包所有依赖的包列表 foreach (string DependAbName in dependenceList) { bool isClear = _AssetBundleDic[DependAbName].abRelation.RemoveReference(abName); // 去掉目标包所依赖的包的被依赖关系 // 如果目标包所依赖的包已经没有被其他包依赖了,则把目标包所依赖的包也卸载掉(递归) if (isClear) { DisposeAssetBundle(DependAbName); } } } } } }// function_end
/// <summary> /// 内部调用, 加载AB包 /// </summary> /// <param name="abName"></param> /// <returns></returns> private IEnumerator LoadAssetBundle(string abName) { // AB包关系的建立 if (!_DicABRelation.ContainsKey(abName)) { //建立关系 ABRelation abRelation = new ABRelation(abName); _DicABRelation.Add(abName, abRelation); } ABRelation tempABRelation = _DicABRelation[abName]; // 获得当前AB包的依赖关系 // 得到指定AB包所有的依赖关系(查询Manifest清单) string[] strDependeceArray = ABManifestLoader.Instance.GetAssetBundleDependce(abName); foreach (var depend in strDependeceArray) { // 添加依赖项 tempABRelation.AddDependence(depend); // 先加载依赖的AB包并设置被依赖关系 yield return(LoadReference(depend, abName)); } //真正加载AB包 if (_DicSingleABLoaderCache.ContainsKey(abName)) { yield return(_DicSingleABLoaderCache[abName].LoadAssetBundle()); } else { _CurrentSingleABLoader = new SingleABLoader(abName, CompleteLoadAB); _DicSingleABLoaderCache.Add(abName, _CurrentSingleABLoader); yield return(_CurrentSingleABLoader.LoadAssetBundle()); } }
public SingleAssetBundleLoader(string abName, ABLoadComplete loadCompleteHandler = null) { this.abName = abName; this.abPath = PathTools.GetUrlPath() + "/" + this.abName; this.loadCompleteHandler = loadCompleteHandler; this.Relation = new ABRelation(abName); }
public AssetBundleItem(string bundleName, Action <bool, string> loadCallbcak) { BundleName = bundleName; abRelation = new ABRelation(bundleName); LoadCallback = loadCallbcak; BundleLoadStatus = BundleLoadStatus.WAIT_LOAD; _ABDownLoadPath = PathTool.GetWWWPath() + "/" + bundleName; }
/// <summary> /// 加载依赖的AB包并设置被依赖关系 /// </summary> /// <param name="abName">当前包依赖的AB包名称</param> /// <param name="refABName">当前的AB包名称</param> /// <returns></returns> private IEnumerator LoadReference(string abName, string refABName) { //如果AB包已经加载 if (_DicABRelation.ContainsKey(abName)) { ABRelation tmpABRelationObj = _DicABRelation[abName]; //添加AB包引用关系(被依赖) tmpABRelationObj.AddReference(refABName); } else { ABRelation tmpABRelationObj = new ABRelation(abName); tmpABRelationObj.AddReference(refABName); _DicABRelation.Add(abName, tmpABRelationObj); //开始加载依赖的包(这是一个递归调用) yield return(LoadAssetBundle(abName)); } }