/// <summary> /// 更新资源 /// </summary> /// <returns>The daemon.</returns> private IEnumerator UpdateAllResources() { // 重置下载字节数标识 DownloadedBytes = 0; // 获取资源下载地址 IList abUrls = (IList)ConfigMgr.Get <JsonData> ("ab_urls", null); // 没有资源更新地址 if (abUrls == null || abUrls.Count == 0 || VersionMgr.UpdateResDict.Count == 0) { // 标识资源更新完成 isUpdateResOk = true; yield break; } // 抛出开始下载资源事件 //LoadingMgr.ChangeState(ResourceLoadingConst.LOAD_TYPE_UPDATE, ResourceLoadingStateConst.LOAD_STATE_UPDATE); // 获取需要更新资源大小 int totalDownloadBytes = VersionMgr.DownloadSize; int downloadedBytes = 0; int idx = 0; // 逐个资源下载 foreach (string fileName in VersionMgr.UpdateResDict.Keys) { // 获取资源名 if (string.IsNullOrEmpty(fileName)) { continue; } // 保证该资源的download成功 while (true) { // 如果idx已经超过了abUrls范围修正一下 if (idx >= abUrls.Count) { idx = 0; } // 创建下载器 Download download = new Download( string.Format("{0}/{1}", abUrls[idx], fileName), 10, ConfigMgr.DOWNLOAD_PATH + fileName); Debug.Log(string.Format("下载补丁包 {0}", download.url)); // 等待获取头部 download.StartGetResponse(); while (!download.isGetResponse && !download.isTimeOut && download.error == 0) { yield return(null); } // GetResponse失败,使用新的链接地址重新下载 if (!download.isGetResponse || download.error != 0 || download.isTimeOut) { // 如果是磁盘空间满的情况,直接退出游戏 if (download.error == -2) { // 弹出窗口玩家让玩家确认一下,玩家确认后等待一下会在重试 bool isConfirmed = false; //DialogMgr.ShowSimpleSingleBtnDailog( // new CallBack((para, obj) =>{ isConfirmed = true; }), // LocalizationMgr.Get("ResourceCheckWnd_8", LocalizationConst.START)); // 等到玩家确认 while (!isConfirmed) { yield return(null); } // 退出应用 Application.Quit(); yield break; } idx++; download.Clear(); // 等待一会重试 yield return(new UnityEngine.WaitForSeconds(0.1f)); // 等待一会重试 continue; } // 开始下载资源 download.StartDownload(); // 等待资源下载完成 while (!download.isDownloaded && !download.isTimeOut && download.error == 0) { // 等待0.1s,尽量不要一帧等待 yield return(new UnityEngine.WaitForSeconds(0.1f)); DownloadedBytes = download.GetTotleDownloadSize() + downloadedBytes; //LoadingMgr.SetProgress (DownloadedBytes/(float)totalDownloadBytes); } // 如果下载资源失败 if (download.isTimeOut || download.error != 0) { // 如果是磁盘空间满的情况,直接退出游戏 if (download.error == -2) { // 弹出窗口玩家让玩家确认一下,玩家确认后等待一下会在重试 bool isConfirmed = false; //DialogMgr.ShowSimpleSingleBtnDailog( // new CallBack((para, obj) =>{ isConfirmed = true; }), // LocalizationMgr.Get("ResourceCheckWnd_8", LocalizationConst.START)); // 等到玩家确认 while (!isConfirmed) { yield return(null); } Application.Quit(); yield break; } idx++; download.Clear(); NIDebug.Log("{0}响应超时或错误", fileName); continue; } // 累计下载进度 downloadedBytes += download.GetTotleDownloadSize(); NIDebug.Log("downloadedBytes 大小{0},oldLoadedBytes 大小为{1}", download.downloadedBytes, download.oldLoadedBytes); NIDebug.Log("已下载总量{0}", downloadedBytes); // 释放下载器 download.Clear(); // 退出循环 break; } } // 设定更新总进度 //LoadingMgr.SetProgress (1.0f); //// 等待进度条结束 //while(!LoadingMgr.IsLoadingEnd(LoadingType.LOAD_TYPE_UPDATE_RES, // ResourceLoadingConst.LOAD_TYPE_UPDATE)) // yield return null; //LoadingMgr.ChangeState(ResourceLoadingConst.LOAD_TYPE_DECOMPRESS, ResourceLoadingStateConst.LOAD_STATE_CHECK); //// 切换流程 //LoadingMgr.ChangeState(ResourceLoadingConst.LOAD_TYPE_DECOMPRESS, ResourceLoadingStateConst.LOAD_STATE_UPDATE); // 当前解压缩文件进度 int unzipSize = 0; bool isUnzipFailed = false; string targetPath = ConfigMgr.ASSETBUNDLES_PATH + "/"; // 资源解压缩 foreach (string fileName in VersionMgr.UpdateResDict.Keys) { // 文件名为空 if (string.IsNullOrEmpty(fileName)) { continue; } // 构建解压缩 Unzip zip = new Unzip( ConfigMgr.GetLocalRootPathWWW(ConfigMgr.DOWNLOAD_NAME + "/" + fileName), targetPath, VersionMgr.UpdateResDict[fileName]); // 开始解压缩 zip.Start(); // 等待解压缩结束 while (!zip.IsUnziped) { // 更新进度 //LoadingMgr.SetProgress((float)(unzipSize + zip.UnzipBytes) / VersionMgr.UnzipSize); yield return(null); } // 累计解压缩数量 unzipSize += zip.UnzipBytes; //LoadingMgr.SetProgress((float)unzipSize / VersionMgr.UnzipSize); // 释放zip zip.Clear(); // 回收内存 DoRecycleGC(); // 解压缩文件成功 if (zip.Error == 0) { // 解压缩成功, 删除补丁文件 // FileMgr.DeleteFile(ConfigMgr.DOWNLOAD_PATH + "/" + fileName); // 更新本地版本文件 VersionMgr.SyncVersion(VersionMgr.UpdateResDict[fileName]); continue; } // 如果解压缩失败 /// 0 : 解压缩成功 /// -1 : 压缩文件载入失败 /// -2 : 内存分配失败 /// -3 : 文件写入失败 /// -4 : 其他异常信息 string msg = string.Empty; //if (zip.Error == -2) // msg = LocalizationMgr.Get("ResourceCheckWnd_22", LocalizationConst.START); //else if (zip.Error == -3) // msg = LocalizationMgr.Get("ResourceCheckWnd_8", LocalizationConst.START); // 给出提示信息 if (!string.IsNullOrEmpty(msg)) { // 弹出窗口玩家让玩家确认一下,玩家确认后等待一下会在重试 bool isConfirmed = false; //DialogMgr.ShowSimpleSingleBtnDailog(new CallBack((para, obj) => // { // isConfirmed = true; // }), msg); // 等到玩家确认 while (!isConfirmed) { yield return(null); } // 退出游戏 Application.Quit(); yield break; } // 标识有资源解压缩失败 isUnzipFailed = true; // 解压缩成功, 删除补丁文件 //FileMgr.DeleteFile(ConfigMgr.DOWNLOAD_NAME + "/" + fileName); // 给出提示信息 Debug.Log(string.Format("补丁包{0}结果解压缩{1}", fileName, zip.Error)); } // 如果有资源解压缩失败,需要玩家确认重启游戏重新下载资源 //if (isUnzipFailed) //{ // // 弹出窗口玩家让玩家确认一下,玩家确认后等待一下会在重试 // bool isConfirmed = false; // DialogMgr.ShowSimpleSingleBtnDailog(new CallBack((para, obj) => // { // isConfirmed = true; // }), LocalizationMgr.Get("ResourceCheckWnd_9", LocalizationConst.START)); // // 等到玩家确认 // while (! isConfirmed) // yield return null; // // 退出游戏 // Application.Quit(); // yield break; //} //// 等待进度条结束 //while(!LoadingMgr.IsLoadingEnd(LoadingType.LOAD_TYPE_UPDATE_RES, // ResourceLoadingConst.LOAD_TYPE_DECOMPRESS)) yield return(null); // 标识资源更新完成 isUpdateResOk = true; }