예제 #1
0
    /// <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;
    }