本雍 2023-03-22 23:33 采纳率: 66.7%
浏览 81
已结题

UnityWebRequest怎么在线程中使用?

我在下载局域网的压缩包的时候,背景在播放视频,在下载的过程中,还有写入数据的时候,播放的视频会卡住。我在想是不是把下载和写入以及后面的压缩的操作,开一个线程,在线程里面处理会不会更好一点,只是我用的UnityWebRequest来加载,需要写在协程里。我看网上有用HttpWebRequest来实现多线程加载,但是我觉得应该是我思路有问题。有人能帮我解惑么。


  /// 
        /// 批量下载压缩包并解压
        /// 
        /// <param name="downloadPath"> 下载文件夹路径 </param>
        /// <param name="savePath">保存文件夹路径</param>
        /// <param name="LoadProgress">加载进度的回调</param>
        /// <param name="DownLoad">完成回调</param>
        /// <returns></returns>
        public IEnumerator DownLoadAllZipAssetByWeb(string downloadPath, string savePath, Action<UnityWebRequest,int,int> LoadProgress, Action DownLoad)
        {
            if (!Directory.Exists(savePath))
            {
                Directory.CreateDirectory(savePath);
            }

            Debug.Log("进入下载的路径:" + downloadPath);
            Debug.Log("进入安装的路径:" + savePath);


            string directoryDownloadPath = ToDirectoryUrl(downloadPath);

            Debug.Log("查询文件夹的路径:" + directoryDownloadPath);

            //得到所有的文件件路径和所有文件的路径
            getSourceFolder(directoryDownloadPath);

            Debug.Log("文件的数量:" + fileVessel.Count);

            int allFileCount = fileVessel.Count;
            int currentDownloadCount = 0;

            for (int i = 0; i < folderVessel.Count; i++)
            {
                string tp = folderVessel[i].Replace(directoryDownloadPath, savePath);
                Directory.CreateDirectory(tp);
            }

            UnityWebRequest request = null;

            for (int i = 0; i < fileVessel.Count; i++)
            {
                currentDownloadCount = i+1;

                string newSaveUrl = fileVessel[i].Replace(directoryDownloadPath, savePath);
                string newDownloadUrl = ToWebRequestUrl(fileVessel[i]);

                packageVessel.Add(newSaveUrl);

                Debug.Log("下载的路径:" + newDownloadUrl);
                Debug.Log("安装的路径:" + newSaveUrl); 

                request = UnityWebRequest.Get(newDownloadUrl);

                if (LoadProgress != null)
                {
                    LoadProgress(request,currentDownloadCount, allFileCount);
                }

                yield return request.SendWebRequest();

                if (request.isNetworkError || request.isHttpError)
                {
                    Debug.Log("Download Error:" + request.error);
                }
                else if (request.isDone)
                {
                    byte[] results = request.downloadHandler.data;

                    FileInfo fileInfo = new FileInfo(newSaveUrl);
                    FileStream fs = fileInfo.Create();

                    fs.Write(results, 0, results.Length);
                    fs.Flush(); //文件写入存储到硬盘
                    fs.Close(); //关闭文件流对象
                    fs.Dispose(); //销毁文件对象
                }
            }

            request.Dispose();

            for (int i = 0; i < packageVessel.Count; i++)
            {
                //开始解压
                FileStream fileStream = new FileStream(packageVessel[i], FileMode.Open);

                DecompressToDirectory(fileStream, savePath);

                //UnzipWithChineseFilesOrDirs(packageVessel[i], savePath);

                //FileInfo info = new FileInfo(packageVessel[i]);
                //info.Delete();
            }

            if (DownLoad != null)
                DownLoad();
        }
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-03-23 09:33
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月31日
  • 已采纳回答 3月23日
  • 创建了问题 3月22日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来