/// <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; } } } }
/// <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)); }
/// <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); }
/// <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); }
/// <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); } }); } } }