internal bool ReqScene(string path) { if (!CachedSceneBundles.ContainsKey(path)) { if (DownloadedFiles.ContainsKey(path)) { FileInfo file = DownloadedFiles[path]; var bytes = File.ReadAllBytes(file.FullName); var ab = AssetBundle.LoadFromMemory(bytes); if (ab != null) //判断AB中是否有该场景 { var scenePaths = ab.GetAllScenePaths(); foreach (var scenePath in scenePaths) { if (Path.GetFileNameWithoutExtension(scenePath) == path) { UpdaterLog.Log("find scene in assetbundle:" + path); CachedSceneBundles.Add(path, ab); break; } } } } } return(Application.CanStreamedLevelBeLoaded(path)); }
/// <summary> /// 读取下载目录,将下载目录中的文件缓存起来 /// </summary> internal void ReadDownloadDir() { DownloadedFiles.Clear(); CachedObjects.Clear(); CachedSceneBundles.Clear(); AsyncLoadingQueue.Clear(); AsyncLoadingSceneQueue.Clear(); if (Directory.Exists(FullDownloadDir)) { // 找到所有的已下载文件 var files = Directory.GetFiles(FullDownloadDir); foreach (var file in files) { FileInfo info = new FileInfo(file); UpdaterLog.Log("find downloaded file:" + info); var fileName = Path.GetFileName(file); DownloadedFiles.Add(fileName, info); } } else { UpdaterLog.Log("create directory:" + FullDownloadDir); Directory.CreateDirectory(FullDownloadDir); } }
public void Init(int versionCode) { this.VersionCode = versionCode; //检查是否有patchIndex文件,并读取内容 var indexFile = UResources.ReqFile(INDEX_FILE_NAME); if (indexFile != null) { string fileJson = DESFileUtil.ReadAllText(indexFile.FullName, DESKey.DefaultKey, DESKey.DefaultIV); _patchIndexLocal = new PatchIndex(this.VersionCode, JObject.Parse(fileJson)); if (_patchIndexLocal.Version != this.VersionCode) { UpdaterLog.Log("发现patchIndex中的主版本不等于目前的主版本,说明刚经历过主包更新,清空补丁"); foreach (var file in ResManager.Ins.DownloadedFiles.Values) { File.Delete(file.FullName); } ResManager.Ins.ReadDownloadDir(); _patchIndexLocal = new PatchIndex(); } } else { _patchIndexLocal = new PatchIndex(); } }
IEnumerator AsyncCreateABReqScene(string path, byte[] bytes) { var abCreateReq = AssetBundle.LoadFromMemoryAsync(bytes); yield return(abCreateReq); var ab = abCreateReq.assetBundle; if (ab != null) //判断AB中是否有该场景 { var scenePaths = ab.GetAllScenePaths(); foreach (var scenePath in scenePaths) { if (Path.GetFileNameWithoutExtension(scenePath) == path) { UpdaterLog.Log("find scene in assetbundle:" + path); CachedSceneBundles.Add(path, ab); break; } } } bool result = Application.CanStreamedLevelBeLoaded(path); //执行回调 Queue <Action <bool> > onDoneQueue = AsyncLoadingSceneQueue[path]; if (onDoneQueue == null) { UpdaterLog.LogException(new Exception("Internal error , the AsyncLoadingQueue have no queue named :" + path)); yield break; } while (onDoneQueue.Count > 0) { onDoneQueue.Dequeue()(result); } }
IEnumerator ClearDelay() { yield return(0); //释放资源物体的引用 CachedObjects.Clear(); //释放场景bundle的引用 CachedSceneBundles.Clear(); UpdaterLog.Log("Clean LevelCached End"); }
void OnSceneLoaded(Scene scene, LoadSceneMode mode) { UpdaterLog.Log("Clean LevelCached Start"); //在切换关卡的时候将保留的Bundle释放 foreach (var bundle in CachedSceneBundles.Values) { bundle.Unload(false); } StartCoroutine(ClearDelay()); }
internal string GetUpdatedStreamingAssetPath(string path) { var fileName = Path.GetFileNameWithoutExtension(path); if (DownloadedFiles.ContainsKey(fileName)) { path = "file://" + DownloadedFiles[fileName].FullName; UpdaterLog.Log("find streaming asset at update path : " + path); } else { path = Path.Combine(Application.streamingAssetsPath, path); if (!path.Contains("://")) { path = "file://" + path; } } return(path); }
IEnumerator AsyncCreateABReqObj(string path, Type type, byte[] bytes) { var abCreateReq = AssetBundle.LoadFromMemoryAsync(bytes); //异步创建ab yield return(abCreateReq); string objectName = Path.GetFileName(path); var abReq = abCreateReq.assetBundle.LoadAssetAsync(objectName, type); //异步读取物体 yield return(abReq); Object obj = abReq.asset; abCreateReq.assetBundle.Unload(false); //一旦加载完毕,立即释放assetbundle,但不释放bundle中的物体,物体会在场景切换时释放 if (obj == null) { UpdaterLog.LogError(string.Format("the resource {0} load async from ab is null", path)); } else { UpdaterLog.Log(string.Format("load async the resource {0} from ab", path)); if (!CachedObjects.ContainsKey(path)) { CachedObjects.Add(path, obj); } } Queue <Action <Object> > onDoneQueue = AsyncLoadingQueue[path]; if (onDoneQueue == null) { UpdaterLog.LogException(new Exception("internal error , the AsyncLoadingQueue have no queue named :" + path)); yield break; } while (onDoneQueue.Count > 0) { onDoneQueue.Dequeue()(obj); } this.AsyncLoadingQueue.Remove(path); }
private void CheckUpdate() { //检查是否有patchIndex文件,并读取内容 Init(this.VersionCode); //构建检查更新需要的表单 JObject json = new JObject(); json["version"] = this.VersionCode; json["patchVersion"] = _patchIndexLocal.PatchVersion; if (CustomData != null) { foreach (var kv in CustomData) { json[kv.Name] = kv; } } WWWForm form = new WWWForm(); form.AddField("P", json.ToString()); HttpManager.Post(CheckUpdateUrl, form, (error, www) => { if (!string.IsNullOrEmpty(error)) { Listener.OnError(error); return; } UpdaterLog.Log(www.text); JObject responseJObj = JObject.Parse(www.text); if (responseJObj["E"].GetString() != null) { Listener?.OnError(responseJObj["E"].AsString()); return; } responseJObj = responseJObj["P"].OptObject(); _updateType = (UpdateType)(responseJObj["Type"].OptInt(0)); switch (_updateType) { case UpdateType.NoUpdate: _patchIndexNew = new PatchIndex(this.VersionCode, responseJObj); //没有找到更新,验证文件 Listener.OnVerifyStart(); if (VerifyPatches()) { Listener.OnVerifySuccess(); Listener.OnPassUpdate(); } else { Listener.OnVerifyFail(); } break; case UpdateType.MainPak: _mainPakIndexFromServer = new MainPakIndex(this.VersionCode, responseJObj); Listener.OnFindMainUpdate(_mainPakIndexFromServer.Info); break; case UpdateType.Patch: _patchIndexNew = new PatchIndex(this.VersionCode, responseJObj); if (Listener != null) { Listener.OnFindPatchUpdate(_patchIndexNew.PatchInfo, _patchIndexNew.TotalPatchSize); } break; } }); }
private void CheckUpdate() { //检查是否有patchIndex文件,并读取内容 var indexFile = UResources.ReqFile(INDEX_FILE_NAME); if (indexFile != null) { string fileJson = DESFileUtil.ReadAllText(indexFile.FullName, DESKey.DefaultKey, DESKey.DefaultIV); _patchIndexLocal = new PatchIndex(this.VersionCode, JObject.Parse(fileJson)); if (_patchIndexLocal.Version != this.VersionCode) { UpdaterLog.Log("发现patchIndex中的主版本不等于目前的主版本,说明刚经历过主包更新,清空补丁"); foreach (var file in ResManager.Ins.DownloadedFiles.Values) { File.Delete(file.FullName); } ResManager.Ins.ReadDownloadDir(); _patchIndexLocal = new PatchIndex(); } } else { _patchIndexLocal = new PatchIndex(); try { //清空下载目录 Directory.Delete(ResManager.FullDownloadDir, true); } catch { } try { // 重新创建目录,并写回PatchIndex Directory.CreateDirectory(ResManager.FullDownloadDir); _patchIndexLocal.WriteToFile(); } catch (Exception e) { Debug.LogException(e); } } //构建检查更新需要的表单 JObject json = new JObject(); json["Version"] = this.VersionCode; json["PatchVersion"] = _patchIndexLocal.PatchVersion; if (CustomData != null) { foreach (var kv in CustomData) { json[kv.Key.ToString()] = kv.Value.ToString(); } } UpdaterLog.Log(json.ToFormatString()); WWWForm form = new WWWForm(); form.AddField("Data", json.ToString()); HttpManager.Post(CheckUpdateUrl, form, (error, www) => { if (!string.IsNullOrEmpty(error)) { Listener.OnError(ErrorCode.NET_CONNECT_ERROR); return; } UpdaterLog.Log(www.text); JObject responseJObj = JObject.Parse(www.text); int code = responseJObj["code"].OptInt(ErrorCode.DEFAULT.Code); if (code == ErrorCode.SUCCESS.Code) { _updateType = responseJObj["Type"].OptEnum <UpdateType>(UpdateType.NoUpdate); switch (_updateType) { case UpdateType.NoUpdate: _patchIndexNew = new PatchIndex(this.VersionCode, responseJObj); //没有找到更新,验证文件 Listener.OnVerifyStart(); if (VerifyPatches()) { Listener.OnVerifySuccess(); Listener.OnPassUpdate(responseJObj); } else { Listener.OnVerifyFail(); } break; case UpdateType.MainPak: _mainPakIndexFromServer = new MainPakIndex(this.VersionCode, responseJObj); Listener.OnFindMainUpdate(_mainPakIndexFromServer.Info); break; case UpdateType.Patch: _patchIndexNew = new PatchIndex(this.VersionCode, responseJObj); if (Listener != null) { Listener.OnFindPatchUpdate(_patchIndexNew.PatchInfo, _patchIndexNew.TotalPatchSize); } break; } } else { Listener.OnError(new ErrorCode(code, responseJObj["error"].OptObject())); } }, null, 15); }
private void CheckUpdate() { //检查是否有patchIndex文件,并读取内容 var indexFile = UResources.ReqFile(INDEX_FILE_NAME); if (indexFile != null) { string fileJson = DESFileUtil.ReadAllText(indexFile.FullName, DESKey.DefaultKey, DESKey.DefaultIV); _patchIndexLocal = new PatchIndex(this.VersionCode, JObject.Parse(fileJson)); if (_patchIndexLocal.Version != this.VersionCode) { UpdaterLog.Log("发现patchIndex中的主版本不等于目前的主版本,说明刚经历过主包更新,清空补丁"); foreach (var file in ResManager.Ins.DownloadedFiles.Values) { File.Delete(file.FullName); } ResManager.Ins.ReadDownloadDir(); _patchIndexLocal = new PatchIndex(); } } else { _patchIndexLocal = new PatchIndex(); } //构建检查更新需要的表单 JObject json = new JObject(); json["Version"] = this.VersionCode; json["PatchVersion"] = _patchIndexLocal.PatchVersion; if (CustomData != null) { foreach (var kv in CustomData) { json[kv.Key.ToString()] = kv.Value.ToString(); } } WWWForm form = new WWWForm(); form.AddField("Data", json.ToString()); HttpManager.Post(CheckUpdateUrl, form, (error, www) => { if (!string.IsNullOrEmpty(error)) { Listener.OnError(error); return; } UpdaterLog.Log(www.text); JObject responseJObj = JObject.Parse(www.text); _updateType = (UpdateType)(responseJObj["Type"].OptInt(0)); switch (_updateType) { case UpdateType.NoUpdate: _patchIndexNew = new PatchIndex(this.VersionCode, responseJObj); //没有找到更新,验证文件 Listener.OnVerifyStart(); if (VerifyPatches()) { Listener.OnVerifySuccess(); Listener.OnPassUpdate(); } else { Listener.OnVerifyFail(); } break; case UpdateType.MainPak: _mainPakIndexFromServer = new MainPakIndex(this.VersionCode, responseJObj); Listener.OnFindMainUpdate(_mainPakIndexFromServer.Info); break; case UpdateType.Patch: _patchIndexNew = new PatchIndex(this.VersionCode, responseJObj); if (Listener != null) { Listener.OnFindPatchUpdate(_patchIndexNew.PatchInfo, _patchIndexNew.TotalPatchSize); } break; } }); }