bool UnloadAssetBundle(string path, bool force = false) { var cachePath = path.ToLower(); var loadedAssetBundle = this.TryGetLoadedAssetBundle(cachePath); if (loadedAssetBundle == null) { return(false); } var isManifest = path == ResConfig.MAINIFEST; var bundleName = isManifest ? path : ResConfig.ConvertToBundleName(path) + ResConfig.BUNDLE_EXTENSION; // Try unload bundle assets, and remove from cache if (force) { loadedAssetBundle.ReferencedCount = 0; } else { loadedAssetBundle.ReferencedCount--; } // Check referencedCount var unload = false; if (loadedAssetBundle.ReferencedCount <= 0) { unload = true; loadedAssetBundle.Unload(); _assetBundles.Remove(cachePath); this.DebugDeallocBundle(cachePath); if (isManifest) { _manifest = null; } } // Try unload depenceBundle if (unload == true && _dependenceInfos.ContainsKey(bundleName)) { var dependencies = _dependenceInfos[bundleName]; for (var i = 0; i < dependencies.Length; ++i) { var dependencePath = ResConfig.ReverseFromBundleName(dependencies[i]); this.UnloadAssetBundle(dependencePath, force); } _dependenceInfos.Remove(bundleName); } return(true); }
LoadedAssetBundle LoadAssetBundle(string path, bool isDependence = false) { this.EnsureManifest(); var cachePath = path.ToLower(); var loadedAssetBundle = this.TryGetLoadedAssetBundle(cachePath); if (loadedAssetBundle != null) { loadedAssetBundle.ReferencedCount++; return(loadedAssetBundle); } var isManifest = path == ResConfig.MAINIFEST; var bundleName = isManifest ? path : ResConfig.ConvertToBundleName(path) + ResConfig.BUNDLE_EXTENSION; // Load dependencies if (isDependence == false) { var dependencies = this.GetDependencies(bundleName, path); for (var i = 0; i < dependencies.Length; ++i) { var dependencePath = ResConfig.ReverseFromBundleName(dependencies[i]); var dependenceBundle = this.LoadAssetBundle(dependencePath, true); if (dependenceBundle == null) { LogManager.Error(string.Format( "ResManager::LoadAssetFromBundle error, dependence({0}) is null!", dependencePath )); } } } // Load & cache assetBundle loadedAssetBundle = new LoadedAssetBundle(path, bundleName); loadedAssetBundle.ReferencedCount = 1; _assetBundles.Add(cachePath, loadedAssetBundle); this.DebugAllocBundle(cachePath); return(loadedAssetBundle); }
public static void ResetBundleName(ref AssetBundleBuild buildInfo) { var assetBundleNameWithoutExtension = buildInfo.assetBundleName.ReplaceLast(ResConfig.BUNDLE_EXTENSION, ""); assetBundleNameWithoutExtension = ResConfig.ConvertToBundleName(assetBundleNameWithoutExtension); var assetBundleName = assetBundleNameWithoutExtension + ResConfig.BUNDLE_EXTENSION; buildInfo.assetBundleName = assetBundleName; foreach (var assetName in buildInfo.assetNames) { var assetImporter = AssetImporter.GetAtPath(assetName); if (assetImporter == null) { LogManager.Error("ResetBundleName error, asset not found: " + assetName); continue; } if (assetImporter.assetBundleName != assetBundleName) { assetImporter.assetBundleName = assetBundleName; } } }
IEnumerator HotUpdating() { // Get local version file at first var localVersionFile = GetLocalVersionFile(); // Get remote version file and compare // Download remote version file and save to temporary directory var file = ResConfig.ConvertToBundleName(ResConfig.VERSION_FILE) + ResConfig.BUNDLE_EXTENSION; var assets = new List <string>(); assets.Add(file); var fileFolder = "resversionfile_tempfolder"; var fileDirectory = ResConfig.MOBILE_HOTUPDATE_PATH + "/" + fileFolder; var failure = false; byte[] downloadBytes = null; yield return(this.StartCoroutine(this.DownloadAssetsAsyncAndSave( ResConfig.SERVER_URL + "/", assets, (processInfo, www) => { if (string.IsNullOrEmpty(processInfo.Error) == false) { failure = true; processInfo.Index = -1; processInfo.Count = 0; this.NotifyHotUpdate(processInfo); } else { var length = www.bytesDownloaded; // var length = www.bytes.Length; downloadBytes = new byte[length]; Array.Copy(www.bytes, 0, downloadBytes, 0, length); } }, fileDirectory ))); if (failure) { yield break; } var txtAsset = this.Load <TextAsset>(fileFolder + "/" + ResConfig.VERSION_FILE); if (txtAsset == null) { var processInfo = new ProcessInfo(); processInfo.File = ResConfig.VERSION_FILE; processInfo.Index = -1; processInfo.Count = 0; processInfo.Error = "Download version file error"; this.NotifyHotUpdate(processInfo); yield break; } var txt = txtAsset.text; var remoteVersionFile = ResVersionFile.UnSerialize(txt); // Unload asset bundle this.UnloadAsset(fileFolder + "/" + ResConfig.VERSION_FILE); // Hotupdating(download and save) var diffInfos = ResVersionFile.GetDiffInfos(localVersionFile, remoteVersionFile); if (diffInfos.Count <= 0) { this.NotifyNoHotUpdate(); yield break; } assets.Clear(); for (int i = 0; i < diffInfos.Count; ++i) { var asset = diffInfos[i].File; assets.Add(asset); } var count = assets.Count; var downloadedCount = 0; yield return(this.StartCoroutine(this.DownloadAssetsAsyncAndSave( ResConfig.SERVER_URL + "/", assets, (processInfo, www) => { downloadedCount++; processInfo.Index = downloadedCount - 1; processInfo.Count = assets.Count; this.NotifyHotUpdate(processInfo); } ))); // Finally replace local version file FileUtility.WriteFile(ResConfig.MOBILE_HOTUPDATE_PATH + "/" + file, downloadBytes, downloadBytes.Length, false); }