使用UnityWebRequest 。
记录url,下载前比较是否已存在相同下载,存在则直接将回调添加在对应url下,统一分发下载进度、下载结果回调。下载完毕将文件缓存在app根目录下。
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Rendering;
/*create by keefor on 2021/3/19*/
/// <summary>
/// 大文件资源上传下载,避免重复操作
/// </summary>
public class HttpFileHelper: ISingleton<HttpFileHelper>
{
private class CallbackCol
{
public Action<DownloadHandler> end;
public Action<float> progress;
public Action<float> upprogress;
}
private class RequestCol
{
public string url;
public UnityWebRequest request;
public List<CallbackCol> list;
}
private List<RequestCol> requestlist = new List<RequestCol>();
private RequestCol FindRequest(string url,Type type)
{
for (int i = 0; i < requestlist.Count; i++)
{
if (url == requestlist[i].url&&requestlist[i].request.downloadHandler.GetType() == type) return requestlist[i];
}
return null;
}
private List<RequestCol> removelist = new List<RequestCol>();
// private Texture2D def;
public static string rootpath {
get { return Application.persistentDataPath + "/_cache/";}
}
public string requsetID;
public string requestHeadersKey;
private void Awake()
{
// def = Resources.Load<Texture2D>("noimg");
Directory.CreateDirectory(rootpath);
requsetID = HttpManager.requsetID;
requestHeadersKey = HttpManager.requestHeadersKey;
}
void LateUpdate()
{
if (requestlist.Count < 0) return;
removelist.Clear();
for (int i = 0; i < requestlist.Count; i++)
{
var req = requestlist[i];
if (req.request == null)
{
removelist.Add(req);
continue;
}
if (req.request.isDone)
{
DownloadHandler down = null;
if (req.request.isNetworkError || req.request.isHttpError)
{
// if(!req.url.StartsWith("file://"))
// MsgCenter.Instance.SendMsg(new Msg_ShowRequestTip{ txt="请求失败