public static List <ResVersionInfo> GetDiffInfos(ResVersionFile local, ResVersionFile remote) { var diffInfos = new List <ResVersionInfo>(); var localFiles = local.Files.ToList(); // Compare for (int i = 0; i < remote.Files.Length; ++i) { var remoteFile = remote.Files[i]; var remoteInfo = remote.Infos[i]; remoteInfo.File = remoteFile; // Is exists ? var localIndex = localFiles.IndexOf(remoteFile); if (localIndex >= 0 == false) { diffInfos.Add(remoteInfo); continue; } // Is same md5 ? var localInfo = local.Infos[localIndex]; if (localInfo.MD5 != remoteInfo.MD5) { diffInfos.Add(remoteInfo); } } return(diffInfos); }
public void TryDecompress() { if (this.IsUnCompressed || this.EnableUncompress == false) { this.NotifyNoUncompress(); return; } _localVersionFile = GetLocalVersionFile(); _decompressCoroutine = this.StartCoroutine(this.DecompressAndSave(_localVersionFile.Infos)); }
ResVersionFile _GetRemoteVersionFile() { ResVersionFile versionFile; var txt = this.DownloadTxt(ResConfig.VERSION_FILE); if (string.IsNullOrEmpty(txt) == false) { versionFile = ResVersionFile.UnSerialize(txt); } else { versionFile = new ResVersionFile(0); } return(versionFile); }
static void BuildVersionFile(BuildTarget targetPlatform, string[] files) { var versionFile = new ResVersionFile(files.Length); for (var i = 0; i < files.Length; ++i) { var file = files[i]; var versionInfo = new ResVersionInfo(); versionInfo.MD5 = MD5Utility.GetFileMD5(file); versionFile.Files[i] = file.ReplaceFirst(_outPath + "/", ""); versionFile.Infos[i] = versionInfo; } FileUtility.WriteFile(_outPath + "/" + ResConfig.VERSION_FILE, versionFile.Serialize()); AssetDatabase.Refresh(); }
ResVersionFile _GetLocalVersionFile() { ResVersionFile versionFile; byte[] bytes = null; var txt = this.LoadTxtAtPath(ResConfig.VERSION_FILE, ref bytes); if (string.IsNullOrEmpty(txt) == false) { versionFile = ResVersionFile.UnSerialize(txt); } else { versionFile = new ResVersionFile(0); } return(versionFile); }
/** * Call HotUpdate when game starting or loading */ public void HotUpdate() { if (this.EnableHotUpdate == false) { this.NotifyNoHotUpdate(); return; } if (Application.isMobilePlatform == false && this.Simulate == false) { this.NotifyNoHotUpdate(); return; } #if UNITY_DEBUG if (Directory.Exists(ResConfig.MOBILE_HOTUPDATE_PATH)) { LogManager.Log(string.Format("HotUpdate: Delete MOBILE_HOTUPDATE_PATH({0})", ResConfig.MOBILE_HOTUPDATE_PATH)); Directory.Delete(ResConfig.MOBILE_HOTUPDATE_PATH, true); } #endif // 1. Check whether need update assets var localVersionFile = _GetLocalVersionFile(); var remoteVersionFile = _GetRemoteVersionFile(); var diffInfos = ResVersionFile.GetDiffInfos(localVersionFile, remoteVersionFile); if (diffInfos.Count <= 0) { this.NotifyNoHotUpdate(); } // 2. Download and save new assets else { this.StartCoroutine(this.DownloadAndSave(diffInfos)); } // 3. TODO: Compress and Load new assets to memory // 4. Save new versionFile if (diffInfos.Count > 0) { FileUtility.WriteFile(ResConfig.MOBILE_HOTUPDATE_PATH + "/" + ResConfig.VERSION_FILE, remoteVersionFile.Serialize()); } }
static ResVersionFile BuildVersionFile(string[] files) { var versionFile = new ResVersionFile(files.Length); for (var i = 0; i < files.Length; ++i) { var file = files[i]; var versionInfo = new ResVersionInfo(); versionInfo.File = file.ReplaceFirst(_outPath + "/", ""); versionInfo.MD5 = MD5Utility.GetFileMD5(file); versionFile.Files[i] = file.ReplaceFirst(_outPath + "/", ""); versionFile.Infos[i] = versionInfo; } var filePath = Application.dataPath + "/" + ResConfig.RES_ROOT + "/" + ResConfig.VERSION_FILE; FileUtility.WriteFile(filePath, versionFile.Serialize()); AssetDatabase.Refresh(); var buildInfo = new AssetBundleBuild(); buildInfo.assetBundleName = ResConfig.VERSION_FILE; var assetName = "Assets/" + ResConfig.RES_ROOT + "/" + ResConfig.VERSION_FILE; buildInfo.assetNames = new string[] { assetName }; ResBuildUtility.ResetBundleName(ref buildInfo); var options = _options & (~BuildAssetBundleOptions.ForceRebuildAssetBundle); BuildPipeline.BuildAssetBundles( _outPath, // new AssetBundleBuild[] { buildInfo }, options, _target ); // Remove temp versionFile File.Delete(filePath); return(versionFile); }
ResVersionFile GetLocalVersionFile() { ResVersionFile versionFile; var txtAsset = this.Load <TextAsset>(ResConfig.VERSION_FILE); var txt = txtAsset.text; if (string.IsNullOrEmpty(txt) == false) { versionFile = ResVersionFile.UnSerialize(txt); } else { versionFile = new ResVersionFile(0); } // Unload this.UnloadAsset(ResConfig.VERSION_FILE); return(versionFile); }
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); }