Example #1
0
        /// <summary>
        /// 移除所有没有被引用的AssetBundle 记录
        /// </summary>
        public static void RemoveAllUnReferenceAssetBundleRecord(bool isForceCheck)
        {
            if (s_LastFullCheckTime == 0)
            {
                s_LastFullCheckTime = Time.realtimeSinceStartup;
            }

            if (isForceCheck || (Time.realtimeSinceStartup - s_LastFullCheckTime) >= s_FullCheckTimeInterval)
            {
                s_LastFullCheckTime = Time.realtimeSinceStartup;

                Dictionary <string, AssetBundleRecordInfor> tempAssetBundleRecordInfors = new Dictionary <string, AssetBundleRecordInfor>(s_AllAssetBundleRecordInfors);

                foreach (var assetBundleRecordInfor in tempAssetBundleRecordInfors)
                {
                    if (assetBundleRecordInfor.Value == null)
                    {
                        s_AllAssetBundleRecordInfors.Remove(assetBundleRecordInfor.Key);
                        continue;
                    }

                    if (assetBundleRecordInfor.Value.mTotalReferenceCount == 0 || assetBundleRecordInfor.Value.IsAssetBundleEnable == false)
                    {
                        s_AllAssetBundleRecordInfors.Remove(assetBundleRecordInfor.Key);
                        AssetBundleRecordInfor.ReleaseAssetBundleRecordInfor(assetBundleRecordInfor.Value);
                        continue;
                    }
                }
            }
        }
Example #2
0
        /// <summary>
        /// 同步 加载 AssetBundleRecordInfor 资源
        /// </summary>
        /// <param name="assetBundleNameUri">AssetBundle 文件名</param>
        /// <param name="assetBundleDirectoryUri">AssetBundle 相对目录 (可能是null)</param>
        /// <returns></returns>
        private static AssetBundleRecordInfor LoadAssetBundleRecordSync(string assetBundleNameUri, string assetBundleDirectoryUri)
        {
            if (string.IsNullOrEmpty(assetBundleNameUri))
            {
                Debug.LogError("LoadAssetBundleRecordSync Fail,Parameter is null");
                return(null);
            }

            //缓存中取
            AssetBundleRecordInfor assetBundleRecordInfor = LoadAssetBundleRecordInforFromCache(assetBundleNameUri);

            if (assetBundleRecordInfor != null && assetBundleRecordInfor.IsAssetBundleEnable)
            {
                return(assetBundleRecordInfor);
            }

            //依赖加载AssetBundle 并递归记录依赖关系
            Dictionary <string, string> dependenceBundlesPath = GetAssetBundleAllDependencies(assetBundleNameUri);
            //key = assetBundleName
            Dictionary <string, AssetBundleRecordInfor> allDependenceAssetBundleRecords = null;

            if (dependenceBundlesPath != null && dependenceBundlesPath.Count > 0)
            {
                allDependenceAssetBundleRecords = new Dictionary <string, AssetBundleRecordInfor>(dependenceBundlesPath.Count);
                foreach (var dependencePath in dependenceBundlesPath)
                {
                    var dependenceAssetBundleRecord = LoadAssetBundleRecordSync(dependencePath.Key, dependencePath.Value);
                    if (dependenceAssetBundleRecord == null)
                    {
                        Debug.LogError($"加载{dependencePath.Key} 的依赖资源{ dependencePath.Value} 失败");
                        return(null);
                    }

                    allDependenceAssetBundleRecords[dependencePath.Key] = dependenceAssetBundleRecord;
                }
            } //递归加载依赖


            //加载参数指定的AssetBundle
            AssetBundle assetBundle = null;

            if (string.IsNullOrEmpty(assetBundleDirectoryUri))
            {
                assetBundle = LoadAssetBundleFromFile(assetBundleNameUri);
            }
            else
            {
                assetBundle = LoadAssetBundleFromFile(assetBundleDirectoryUri.CombinePathEx(assetBundleNameUri));
            }

            return(RecordAssetBundleDepdence(assetBundleNameUri, assetBundle, allDependenceAssetBundleRecords));
        }
Example #3
0
 /// <summary>//
 /// / 加载缓存的 AssetBundleRecordInfor
 /// <param name="assetFullUri">资源相对于Resources的完整路径</param>
 private static AssetBundleRecordInfor LoadAssetBundleRecordInforFromCache(string assetBundleNameUri)
 {
     if (s_AllAssetBundleRecordInfors.TryGetValue(assetBundleNameUri, out var assetBundleRecordInfor))
     {
         if (assetBundleRecordInfor == null || assetBundleRecordInfor.IsAssetBundleEnable == false)
         {
             s_AllLoadedAssetBundleSubAssetRecord.Remove(assetBundleNameUri);
             if (assetBundleRecordInfor != null)
             {
                 AssetBundleRecordInfor.ReleaseAssetBundleRecordInfor(assetBundleRecordInfor);
             }
             return(null);
         }
         return(assetBundleRecordInfor);
     }
     return(null);
 }
Example #4
0
        /// <summary>
        /// 生成AssetBundle 加载记录并记录其依赖的其他 AssetBundle
        /// </summary>
        /// <param name="assetBundleNameUri"></param>
        /// <param name="assetBundle"></param>
        /// <param name="allDependenceAssetBundleRecords"></param>
        /// <returns></returns>
        private static AssetBundleRecordInfor RecordAssetBundleDepdence(string assetBundleNameUri, AssetBundle assetBundle, Dictionary <string, AssetBundleRecordInfor> allDependenceAssetBundleRecords)
        {
            if (assetBundle == null)
            {
                Debug.LogError($"RecordAssetBundleDepdence Fail,AssetBundle NOT Exit {assetBundleNameUri}");
                return(null);
            }

            AssetBundleRecordInfor assetBundleRecordInfor = AssetBundleRecordInfor.GetAssetBundleRecordInfor(assetBundleNameUri, assetBundle);

            if (allDependenceAssetBundleRecords != null)
            {
                //记录依赖这些AssetBundle
                foreach (var dependenceAssetBundleRecord in allDependenceAssetBundleRecords.Values)
                {
                    assetBundleRecordInfor.AddDependenceAssetBudleRecord(dependenceAssetBundleRecord);
                }
                allDependenceAssetBundleRecords.Clear();
            }

            s_AllAssetBundleRecordInfors[assetBundleNameUri] = assetBundleRecordInfor;
            return(assetBundleRecordInfor);
        }
Example #5
0
        /// <summary>
        ///  异步加载 AssetBundleRecordInfor 资源
        /// </summary>
        /// <param name="assetBundleNameUri">AssetBundle 文件名</param>
        /// <param name="assetBundleDirectoryUri">AssetBundle 相对目录(可能是null)</param>
        /// <param name="completeCallback"></param>
        private static void LoadAssetBundleRecordAsync(string assetBundleNameUri, string assetBundleDirectoryUri, Action <AssetBundleRecordInfor> completeCallback)
        {
            if (string.IsNullOrEmpty(assetBundleNameUri))
            {
                Debug.LogError("LoadAssetBundleRecordAsync Fail,Parameter is null");
                completeCallback?.Invoke(null);
                return;
            }

            //缓存中取
            AssetBundleRecordInfor assetBundleRecordInfor = LoadAssetBundleRecordInforFromCache(assetBundleNameUri);

            if (assetBundleRecordInfor != null && assetBundleRecordInfor.IsAssetBundleEnable)
            {
                completeCallback?.Invoke(assetBundleRecordInfor);
                return;
            }

            // 依赖加载AssetBundle 并递归记录依赖关系
            Dictionary <string, string> dependenceBundlesPath = GetAssetBundleAllDependencies(assetBundleNameUri);
            //key = assetBundleName
            Dictionary <string, AssetBundleRecordInfor> allDependenceAssetBundleRecords = null;

            if (dependenceBundlesPath != null && dependenceBundlesPath.Count > 0)
            {
                allDependenceAssetBundleRecords = new Dictionary <string, AssetBundleRecordInfor>(dependenceBundlesPath.Count);
                int depdenceABundleCount = dependenceBundlesPath.Count;
                foreach (var dependencePath in dependenceBundlesPath)
                {
                    LoadAssetBundleRecordAsync(dependencePath.Key, dependencePath.Value, (dependenceRecord) =>
                    {
                        if (dependenceRecord == null)
                        {
                            Debug.LogError($"加载{dependencePath.Key} 的依赖资源{dependencePath.Value} 失败");
                            completeCallback?.Invoke(null);
                            return;
                        } //某个依赖加载失败

                        allDependenceAssetBundleRecords[dependencePath.Key] = dependenceRecord;
                        --depdenceABundleCount;
                        //全部以来加载完
                        if (depdenceABundleCount == 0)
                        {
                            AssetBundleCreateRequest requst = null;

                            if (string.IsNullOrEmpty(assetBundleDirectoryUri))
                            {
                                requst = LoadAssetBundleFromFileAsync(assetBundleNameUri);
                            }
                            else
                            {
                                requst = LoadAssetBundleFromFileAsync(assetBundleDirectoryUri.CombinePathEx(assetBundleNameUri));
                            }

                            if (requst == null)
                            {
                                Debug.LogError($"LoadAssetBundleRecordAsync Fail,AssetBundle NOT Exit {assetBundleNameUri}");
                                completeCallback?.Invoke(null);
                                return;
                            }

                            AsyncManager.StartAsyncOperation(requst, () => completeCallback?.Invoke(RecordAssetBundleDepdence(assetBundleNameUri, requst.assetBundle, allDependenceAssetBundleRecords)), null);
                        }
                    });
                }
            }
        }