Example #1
0
        /// <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);
 }
Example #4
0
 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));
            }
        }