IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity下载大文件断点续传 -> 正文阅读

[游戏开发]Unity下载大文件断点续传

最近要使用安卓更新下载apk更新功能,由于安卓机运行内存有限,下载大文件就得采用实时下载写入,实时释放内存的方法。考虑到网络环境不稳定时下载被迫中断的情况,重新从头下载会导致不必要的资源浪费,断点续传也很有必要。UnityWebRequest的DownloadHandlerFile可以做到实时下载写入,不必占用整个文件大小的内存。在unity新版本中,DownloadHandlerFile新增的append参数设置为true时文件写入方式为接续写入,不覆盖原文件。首先要获取服务器将要下载文件的大小这时可用UnityWebRequest.Head再通过GetResponseHeader("Content-Length")获取文件大小。需要注意的是如果服务器文件会有变动,可以自己加入数据校验,校验通过再续传文件。还有确保下载的文件URL是可以直接下载文件而不是重定向的url.

IEnumerator 断点下载(string 下载地址, string 保存路径)
    {
        Debug.Log("下载地址:" + 下载地址 + ",保存路径:" + 保存路径);
        UnityWebRequest headRequest = UnityWebRequest.Head(下载地址);
        yield return headRequest.SendWebRequest();
        if (!string.IsNullOrEmpty(headRequest.error))
        {
            Debug.LogError("获取下载的文件大小失败");
            yield break;
        }
        ulong totalLength = ulong.Parse(headRequest.GetResponseHeader("Content-Length"));//获取文件总大小
        Debug.Log("获取大小"+ totalLength);
        headRequest.Dispose();
        UnityWebRequest Request = UnityWebRequest.Get(下载地址);
        Request.downloadHandler = new DownloadHandlerFile(保存路径, true);//append设置为true文件写入方式为接续写入,不覆盖原文件。
        FileInfo file = new FileInfo(保存路径);
        ulong fileLength = (ulong)file.Length;
        Debug.Log("文件总共大小:" + fileLength + ",totalLength=" + totalLength);
        ///request.SetRequestHeader("Range", "bytes=" + fileLength + "-"+ totalLength);
        //设置文件从什么位置开始下载和写入
        Request.SetRequestHeader("Range", "bytes=" + fileLength + "-");
        if (fileLength < totalLength)
        {
            Request.SendWebRequest();
            while (!Request.isDone)
            {
                double progress = (Request.downloadedBytes + fileLength) / (double)totalLength;
                //进度条.value = (float)progress;
                Debug.Log("下载进度" + progress);
                yield return null;
            }
        }
        if (string.IsNullOrEmpty(Request.error))
        {
            Debug.Log("下载成功"+ 保存路径);
        }
        else
        {
            Debug.LogError("下载失败"+ Request.error);
        }
        Request.Dispose();
    }

?demo下载:https://download.csdn.net/download/chunyu90225/20061376

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-07-10 14:48:12  更:2021-07-10 14:48:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 4:25:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码