Esempio n. 1
0
        /// <summary>
        /// 同步加载AB包,安卓下可能会有问题(路径问题)
        /// </summary>
        /// <param name="bundleName">包名</param>
        /// <returns></returns>
        public AssetBundleItem LoadBundleSync(string bundleName)
        {
            if (_AssetBundlePool.BundleIsLoaded(bundleName))
            {
                return(_AssetBundlePool.GetBundleItem(bundleName));
            }
            // 检查主Manifest清单文件是否加载完成
            if (!ABManifestLoader.Instance.IsLoadFinish)
            {
                Debug.LogError("加载" + bundleName + "的时候,主清单尚未加载完毕");
                return(null);
            }
            // 检查目标包及其依赖包是否在异步加载中
            if (CheckBundleCanLoadSync(bundleName) == false)
            {
                Debug.LogError(bundleName + "或其依赖包在异步加载中,不能进行同步加载");
                return(null);
            }

            AssetBundleItem bundleItem = _AssetBundlePool.GetBundleItem(bundleName);

            if (bundleItem == null)
            {
                bundleItem = _AssetBundlePool.AddBundleItem(bundleName);
            }

            bundleItem.BundleLoadStatus = BundleLoadStatus.LOADING;
            LoadBundleDependeceSync(bundleItem);

            return(bundleItem);
        }
Esempio n. 2
0
        /// <summary>
        /// 加载ab包并添加依赖项
        /// </summary>
        /// <param name="bundleItem">加载目标包</param>
        private void LoadBundleDependeceSync(AssetBundleItem bundleItem)
        {
            string[] strDependeceArray = ABManifestLoader.Instance.GetAssetBundleDependce(bundleItem.BundleName);
            foreach (var depend in strDependeceArray)
            {
                // 添加依赖项
                bundleItem.abRelation.AddDependence(depend);
                AssetBundleItem dependBundleItem = _AssetBundlePool.GetBundleItem(depend);
                if (dependBundleItem != null && _AssetBundlePool.BundleIsLoaded(depend))
                {
                    // 添加被依赖项
                    dependBundleItem.abRelation.AddReference(bundleItem.BundleName);
                    continue;
                }

                if (dependBundleItem == null)
                {
                    dependBundleItem = _AssetBundlePool.AddBundleItem(depend);
                }
                dependBundleItem.BundleLoadStatus = BundleLoadStatus.LOADING;
                // 添加被依赖项
                dependBundleItem.abRelation.AddReference(bundleItem.BundleName);
                LoadBundleDependeceSync(dependBundleItem);
            }

            bundleItem.LoadAssetBundleSync();
        }
Esempio n. 3
0
 public void LoadBundleAsset(string bundleName, string assetName, Action <UnityEngine.Object> loadcallback, bool isCache = false)
 {
     // 判断AB包是否已加载
     if (_AssetBundlePool.BundleIsLoaded(bundleName))
     {
         AssetBundleItem    bundleItem = _AssetBundlePool.GetBundleItem(bundleName);
         UnityEngine.Object obj        = bundleItem.LoadAsset(assetName, isCache);
         loadcallback(obj);
     }
     else
     {
         // 创建AB包加载完毕回调
         Action <bool, string> bundleLoadCallback = delegate(bool succeed, string assetbundleName)
         {
             // 如果加载成功
             if (succeed)
             {
                 AssetBundleItem    abItem = _AssetBundlePool.GetBundleItem(assetbundleName);
                 UnityEngine.Object obj    = abItem.LoadAsset(assetName, isCache);
                 loadcallback(obj);
             }
             else
             {
                 loadcallback(null);
             }
         };
         // 先加载AB包
         LoadBundle(bundleName, bundleLoadCallback);
     }
 }
Esempio n. 4
0
        /// <summary>
        /// 加载依赖的AB包并设置被依赖关系
        /// </summary>
        /// <param name="dependBundleName">当前包依赖的AB包名称</param>
        /// <param name="bundleItem">当前包Item</param>
        /// <returns></returns>
        private IEnumerator LoadReference(string dependBundleName, AssetBundleItem bundleItem)
        {
            Action <bool, string> loadCompleteCallback = delegate(bool succeed, string assetBundleName)                 //协程加载完成的回调
            {
                if (succeed)
                {
                    //添加AB包被依赖关系(引用)
                    _AssetBundlePool.GetBundleItem(assetBundleName).abRelation.AddReference(bundleItem.BundleName);
                }
            };

            AssetBundleItem dependBundleItem = _AssetBundlePool.GetBundleItem(dependBundleName);

            //如果AB包已经加载
            if (dependBundleItem != null)
            {
                //添加AB包被依赖关系(引用)
                dependBundleItem.abRelation.AddReference(bundleItem.BundleName);
            }
            else
            {
                //开始加载依赖的包(这是一个递归调用)
                yield return(LoadBundleIEn(dependBundleName, loadCompleteCallback));
            }
        }
Esempio n. 5
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
Esempio n. 6
0
        public AssetBundleItem AddBundleItem(string bundleName, Action <bool, string> loadCallbcak = null)
        {
            AssetBundleItem assetBundleItem = new AssetBundleItem(bundleName, loadCallbcak);

            _AssetBundleDic.Add(bundleName, assetBundleItem);
            return(assetBundleItem);
        }
Esempio n. 7
0
        private IEnumerator LoadBundleIEn(string bundleName, Action <bool, string> loadCallback)
        {
            //等待主Manifest清单文件加载完成
            while (!ABManifestLoader.Instance.IsLoadFinish)
            {
                yield return(null);
            }

            AssetBundleItem bundleItem = _AssetBundlePool.GetBundleItem(bundleName);

            // 检查是否已加载
            if (_AssetBundlePool.BundleIsLoaded(bundleName))
            {
                loadCallback(true, bundleName);
            }
            // 检查是否加载中
            else if (bundleItem != null && bundleItem.BundleLoadStatus == BundleLoadStatus.LOADING)
            {
                bundleItem.LoadCallback += loadCallback;
            }
            else
            {
                if (bundleItem == null)
                {
                    bundleItem = _AssetBundlePool.AddBundleItem(bundleName, loadCallback);
                }
                else
                {
                    bundleItem.LoadCallback += loadCallback;
                }
                bundleItem.BundleLoadStatus = BundleLoadStatus.LOADING;

                string[] strDependeceArray = ABManifestLoader.Instance.GetAssetBundleDependce(bundleItem.BundleName);
                foreach (var depend in strDependeceArray)
                {
                    // 添加依赖项
                    bundleItem.abRelation.AddDependence(depend);
                    // 先加载所有依赖的AB包并设置被依赖关系
                    yield return(LoadReference(depend, bundleItem));
                }

                // 真正加载AB包
                yield return(bundleItem.LoadAssetBundle());
            }
        }
Esempio n. 8
0
 /// <summary>
 /// 同步加载ab包资源
 /// </summary>
 /// <param name="bundleName">包名</param>
 /// <param name="assetName">资源名</param>
 /// <returns></returns>
 public UnityEngine.Object LoadBundleAssetSync(string bundleName, string assetName, bool cache = false)
 {
     if (_AssetBundlePool.BundleIsLoaded(bundleName))
     {
         return(_AssetBundlePool.GetBundleItem(bundleName).LoadAsset(assetName, cache));
     }
     else
     {
         AssetBundleItem bundleItem = LoadBundleSync(bundleName);
         if (bundleItem != null)
         {
             return(bundleItem.LoadAsset(assetName, cache));
         }
         else
         {
             return(null);
         }
     }
 }
Esempio n. 9
0
        /// <summary>
        /// 检查ab包能否在进行异步加载,如果处于异步加载中,则不允许进行同步加载
        /// </summary>
        /// <returns></returns>
        public bool CheckBundleCanLoadSync(string bundleName)
        {
            AssetBundleItem bundleItem = _AssetBundlePool.GetBundleItem(bundleName);

            if (bundleItem != null && bundleItem.BundleLoadStatus == BundleLoadStatus.LOADING)
            {
                return(false);
            }

            string[] strDependeceArray = ABManifestLoader.Instance.GetAssetBundleDependce(bundleName);
            foreach (var depend in strDependeceArray)
            {
                if (CheckBundleCanLoadSync(depend) == false)
                {
                    return(false);
                }
            }
            return(true);
        }