UnityWebRequest下载网络或本地资源,支持断点续传、多文件同时下载

来源:互联网 发布:java api全部包类 编辑:程序博客网 时间:2024/06/15 22:35
今晚研究了下关于Unity中文件下载的断点续传功能,Unity已经封装了网络资源的下载API,当然也可以使用C#中的API进行资源下载。
    首先说一下断点续传的大概思路
    1、下载一个文件时,向服务器发送下载请求,发送一个Range的报文,指定从文件数据的什么位置开始获取数据,把从服务器路径接收到的文件数据,用文件流操作按顺序写入到本地临时文件流,当中断下载时,保存已下载的临时文件数据,释放文件流操作和下载请求。
    2、当再次进行下载时,用文件流读取本地已下载的临时文件,这时向服务器发送下载请求,把当前临时文件的大小作为Range报文的数据发送给服务器,此时就可以从上次下载的位置继续进行数据下载。这里注意的是,文件流的写入位置要设置为之前临时文件的最后,即Position等于临时文件的大小,这样才会将新的文件数据与之前的结合起来。
    3、当文件的全部数据都下载完成时,将临时文件重命名为真正的文件。

    然后说一下多文件同时下载的逻辑:多文件下载就是在单文件下载的基础上,每一个下载请求都是独立进行的,这就类似于多线程并发操作,需要注意的是多个下载连接会共同占用网络带宽,每个文件的下载速度都会降低。

    使用C#源生的API下载网络资源,基本上要使用到多线程下载机制,而Unity5.3以后的版本中带了一个UnityWebRequest的API,发现这个API可以真牛逼,应该完全可以代替WWW的所有功能(自己吹的牛逼……)
这个UnityWebRequest可以下载资源、上传数据、获取下载进度、中止下载等等,而且是在Unity的主线程中进行的。
下面简单说明下载操作

    //下载的协程    public IEnumerator StartDownload(string url, string savePath)    {        _DownloadHandler loadHandler = new _DownloadHandler(savePath);        UnityWebRequest request = UnityWebRequest.Get(url);        request.chunkedTransfer = true;        request.disposeDownloadHandlerOnDispose = true;        request.SetRequestHeader("Range", "bytes = " + loadHandler.DownedLength + "-"); //断点续传设置读取文件数据流开始索引,成功会返回206        yield return request.Send(); //协程操作    }

以上是下载资源的主要操作,而数据处理和回调使用的是UnityWebRequest的downloadHandler属性,这个属性类型是DownloadHandler,因此需要我们自定义一个类集成DownloadHandler,然后重写里面的虚方法。注意里面的虚方法大部分都是回调类型的,也就是说都是由UnityWebRequest在下载过程中主动调用的,例如virtual void CompleteContent()方法是完成下载时的触发的回调,virtual void ReceiveContentLength(int contentLength)是刚开始下载时接收到整个文件的大小的回调,virtual bool ReceiveData(byte[] data, int dataLength)是下载中不断接收到文件数据的回调,等等。

我也不多说了,直接给分享简单的下载框架,主要功能只有两个脚本,一看遍明白了
http://download.csdn.net/download/u010377179/10155918
阅读全文
0 0