/// <summary> /// Get download size of entire bundles(except cached) /// </summary> /// <param name="manifest">manifest you get from GetManifest() function</param> /// <param name="subsetNames">names that you interested among full bundle list(optional)</param> /// <returns></returns> public static long GetDownloadSize(AssetbundleBuildManifest manifest, IEnumerable <string> subsetNames = null) { if (!Initialized) { throw new System.Exception("BundleManager is not initialized"); } long totalSize = 0; var bundleInfoList = subsetNames == null ? manifest.BundleInfos : manifest.CollectSubsetBundleInfoes(subsetNames); for (int i = 0; i < bundleInfoList.Count; i++) { var bundleInfo = bundleInfoList[i]; var uselocalBundle = s_LocalBundles.TryGetValue(bundleInfo.BundleName, out var localHash) && localHash == bundleInfo.Hash; if (!uselocalBundle && !Caching.IsVersionCached(bundleInfo.AsCached)) { totalSize += bundleInfo.Size; } } return(totalSize); }
static IEnumerator CoDownloadAssetBundles(AssetbundleBuildManifest manifest, IEnumerable <string> subsetNames, BundleAsyncOperation <bool> result) { if (!Initialized) { Debug.LogError("Do Initialize first"); result.Done(BundleErrorCode.NotInitialized); yield break; } #if UNITY_EDITOR if (UseAssetDatabase) { result.Done(BundleErrorCode.Success); yield break; } #endif var bundlesToUnload = new HashSet <string>(s_AssetBundles.Keys); var downloadBundleList = subsetNames == null ? manifest.BundleInfos : manifest.CollectSubsetBundleInfoes(subsetNames); var bundleReplaced = false; //bundle has been replaced result.SetIndexLength(downloadBundleList.Count); for (int i = 0; i < downloadBundleList.Count; i++) { result.SetCurrentIndex(i); var bundleInfo = downloadBundleList[i]; //remove from the set so we can track bundles that should be cleared bundlesToUnload.Remove(bundleInfo.BundleName); var islocalBundle = s_LocalBundles.TryGetValue(bundleInfo.BundleName, out var localHash) && localHash == bundleInfo.Hash; var isCached = Caching.IsVersionCached(bundleInfo.AsCached); result.SetCachedBundle(isCached); var loadURL = islocalBundle ? Utility.CombinePath(LocalURL, bundleInfo.BundleName) : Utility.CombinePath(RemoteURL, bundleInfo.BundleName); if (LogMessages) { Debug.Log($"Loading Bundle Name : {bundleInfo.BundleName}, loadURL {loadURL}, isLocalBundle : {islocalBundle}, isCached {isCached}"); } LoadedBundle previousBundle; if (s_AssetBundles.TryGetValue(bundleInfo.BundleName, out previousBundle) && previousBundle.Hash == bundleInfo.Hash) { if (LogMessages) { Debug.Log($"Loading Bundle Name : {bundleInfo.BundleName} Complete - load skipped"); } } else { var bundleReq = islocalBundle ? UnityWebRequestAssetBundle.GetAssetBundle(loadURL) : UnityWebRequestAssetBundle.GetAssetBundle(loadURL, bundleInfo.AsCached); var operation = bundleReq.SendWebRequest(); while (!bundleReq.isDone) { result.SetProgress(operation.progress); yield return(null); } if (bundleReq.isNetworkError || bundleReq.isHttpError) { result.Done(BundleErrorCode.NetworkError); yield break; } if (s_AssetBundles.TryGetValue(bundleInfo.BundleName, out previousBundle)) { bundleReplaced = true; previousBundle.Bundle.Unload(false); if (previousBundle.RequestForReload != null) { previousBundle.RequestForReload.Dispose(); //dispose reload bundle } s_AssetBundles.Remove(bundleInfo.BundleName); } var loadedBundle = new LoadedBundle(bundleInfo, loadURL, DownloadHandlerAssetBundle.GetContent(bundleReq), islocalBundle); s_AssetBundles.Add(bundleInfo.BundleName, loadedBundle); CollectSceneNames(loadedBundle); if (LogMessages) { Debug.Log($"Loading Bundle Name : {bundleInfo.BundleName} Complete"); } bundleReq.Dispose(); } } //let's drop unknown bundles loaded foreach (var name in bundlesToUnload) { var bundleInfo = s_AssetBundles[name]; bundleInfo.Bundle.Unload(false); if (bundleInfo.RequestForReload != null) { bundleInfo.RequestForReload.Dispose(); //dispose reload bundle } s_AssetBundles.Remove(bundleInfo.Name); } //bump entire bundles' usage timestamp //we use manifest directly to find out entire list for (int i = 0; i < manifest.BundleInfos.Count; i++) { var cachedInfo = manifest.BundleInfos[i].AsCached; if (Caching.IsVersionCached(cachedInfo)) { Caching.MarkAsUsed(cachedInfo); } } if (LogMessages) { Debug.Log($"CacheUsed Before Cleanup : {Caching.defaultCache.spaceOccupied} bytes"); } Caching.ClearCache(600); //as we bumped entire list right before clear, let it be just 600 if (LogMessages) { Debug.Log($"CacheUsed After CleanUp : {Caching.defaultCache.spaceOccupied} bytes"); } PlayerPrefs.SetString("CachedManifest", JsonUtility.ToJson(manifest)); GlobalBundleHash = manifest.GlobalHash.ToString(); result.Result = bundleReplaced; result.Done(BundleErrorCode.Success); }