Unity 断点下载教程:使用 UnityWebRequest 实现断点续传并显示进度
以下是一个使用 UnityWebRequest 实现断点下载,并显示下载进度和流式存储已下载数据的例子:
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using System.IO;
public class DownloadManager : MonoBehaviour
{
private const string downloadUrl = 'http://example.com/file.zip'; // 下载文件的URL
private const string savePath = 'C:/Downloads/file.zip'; // 文件保存路径
private UnityWebRequest request;
private FileStream fileStream;
private long fileLength;
private long downloadedLength;
void Start()
{
StartCoroutine(DownloadFile());
}
IEnumerator DownloadFile()
{
fileLength = 0;
downloadedLength = 0;
if (File.Exists(savePath))
{
fileStream = File.OpenWrite(savePath);
fileLength = fileStream.Length;
request = UnityWebRequest.Get(downloadUrl);
request.SetRequestHeader('Range', 'bytes=' + fileLength + '-');
}
else
{
fileStream = File.Create(savePath);
request = UnityWebRequest.Get(downloadUrl);
}
request.downloadHandler = new DownloadHandlerFile(fileStream);
yield return request.SendWebRequest();
if (request.isNetworkError || request.isHttpError)
{
Debug.Log(request.error);
}
else
{
Debug.Log('Download complete.');
}
fileStream.Close();
}
void Update()
{
if (request != null)
{
if (fileLength == 0)
{
fileLength = request.GetResponseHeader('Content-Length') == null ? request.downloadedBytes : long.Parse(request.GetResponseHeader('Content-Length'));
}
downloadedLength = fileLength == 0 ? request.downloadedBytes : fileStream.Length;
float progress = (float)downloadedLength / (float)fileLength * 100f; // 计算下载进度
Debug.Log('Download progress: ' + progress + '%');
}
}
}
在上面的例子中,我们首先检查本地是否已经存在要下载的文件,如果存在,则设置请求头Range,以便从上次下载的位置继续下载。如果不存在,则创建新文件。
然后,我们将DownloadHandlerFile对象分配给UnityWebRequest.downloadHandler属性,以便将下载的数据写入文件流。我们使用UnityWebRequest.GetResponseHeader方法获取Content-Length响应头,以便计算文件大小和下载进度。
在Update方法中,我们使用下载的数据量和文件大小计算下载进度,并将其显示在控制台中。
最后,我们在下载完成时关闭文件流。
原文地址: https://www.cveoy.top/t/topic/lMQ3 著作权归作者所有。请勿转载和采集!