Unity中 基于UnityWebRequest网络下载器的封装
UnityWebRequestManager:
/********************************************* * * Title: UnityWebRequest下载管理器 * * Description: 统一获取需要请求的Web数据,用法很简单,只需要去声明 UnityWebRequestTask task = new UnityWebRequestTask(传递参数) 然后 AddTask(task) * * Author: * * Date: 2019.7.1 * * Modify: * *********************************************/ using System.Collections; using System.Collections.Generic; using UnityEngine.Networking; public class UnityWebRequestManager : MonoBehavior { /// <summary> /// 下载任务队列 /// </summary> private Queue<UnityWebRequestTask> m_TaskQue = new Queue<UnityWebRequestTask>(); /// <summary> /// 最大并发数 /// </summary> private int m_MaxCount = 2; /// <summary> /// 当前下载数 /// </summary> private int m_CurrentCount = 0; /// <summary> /// 是否下载完成 /// </summary> private bool m_AllFinish = true; public static UnityWebRequestManager Instance; void Awake() { Instance = this; } public void AddTask(UnityWebRequestTask task) { m_TaskQue.Enqueue(task); if (m_AllFinish) { StartCoroutine(DownLoadQueue()); } } /// <summary> /// 开始下载任务 /// </summary> /// <returns></returns> IEnumerator DownLoadQueue() { m_AllFinish = false; while (m_TaskQue.Count>0) { if (m_CurrentCount<m_MaxCount) { m_CurrentCount++; UnityWebRequestTask task = m_TaskQue.Dequeue(); task.m_DownLoadFinish += delegate (UnityWebRequest webRequest) { m_CurrentCount--; }; StartCoroutine(task.DownLoad()); } yield return null; } m_AllFinish = true; } }
UnityWebRequestTask:目前已知的常用类型为Post,Get
/********************************************* * * Title: UnityWebRequest下载列表 * * Description: 封装 控制UnityWebRequest 下载的Post请求 Get请求 * * Author: * * Date: 2019 * * Modify: * *********************************************/ using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; public enum DownLoadType { NONE, GET, POST, POSTMULTIPART } public class UnityWebRequestTask { /// <summary> /// 下载开始 /// </summary> private Action<UnityWebRequest> m_DownLoadBegin; /// <summary> /// 下载结束 /// </summary> public Action<UnityWebRequest> m_DownLoadFinish; /// <summary> /// 下载错误 /// </summary> private Action<UnityWebRequest, UnityWebRequestTask> m_DownLoadError; /// <summary> /// 下载类型 /// </summary> private DownLoadType m_DownLoadType; /// <summary> /// 下载地址 /// </summary> private string m_Url { get; set; } private WWWForm m_WWWForm; /// <summary> /// 表单参数 和 WWWForm 用法类似 /// 使用方式: /// m_FormSection.Add(new MultipartFormDataSection("参数1", 参数2)); /// </summary> private List<IMultipartFormSection> m_FormSection = new List<IMultipartFormSection>(); /// <summary> /// Get请求传参 /// </summary> /// <param name="_url">地址</param> /// <param name="_type">参数类型</param> /// <param name="_downLoadBegin">开始下载</param> /// <param name="_downLoadFinish">下载完成</param> /// <param name="_downLoadError">错误回调</param> public UnityWebRequestTask(string _url, DownLoadType _type, Action<UnityWebRequest> _downLoadFinish, Action<UnityWebRequest> _downLoadBegin = null, Action<UnityWebRequest, UnityWebRequestTask> _downLoadError = null) { m_Url = _url; m_DownLoadType = _type; if (_downLoadBegin != null) m_DownLoadBegin = _downLoadBegin; if (_downLoadError != null) m_DownLoadError = _downLoadError; m_DownLoadFinish = _downLoadFinish; } /// <summary> /// Post请求传参 /// </summary> /// <param name="_url">地址</param> /// <param name="_type">参数类型</param> /// <param name="_downLoadBegin">开始下载</param> /// <param name="_downLoadFinish">下载完成</param> /// <param name="_downLoadError">错误回调</param> /// <param name="_form">form参数</param> public UnityWebRequestTask(string _url, DownLoadType _type, WWWForm _form, Action<UnityWebRequest> _downLoadFinish,Action<UnityWebRequest> _downLoadBegin = null , Action<UnityWebRequest, UnityWebRequestTask> _downLoadError = null ) { m_Url = _url; m_DownLoadType = _type; m_WWWForm = _form; m_DownLoadFinish = _downLoadFinish; if (_downLoadBegin!=null) m_DownLoadBegin = _downLoadBegin; if (_downLoadError!=null) m_DownLoadError = _downLoadError; } /// <summary> /// Post请求传参 /// </summary> /// <param name="_url">地址</param> /// <param name="_type">参数类型</param> /// <param name="_downLoadBegin">开始下载</param> /// <param name="_downLoadFinish">下载完成</param> /// <param name="_downLoadError">错误回调</param> /// <param name="_section">参数</param> public UnityWebRequestTask(string _url, DownLoadType _type, List<IMultipartFormSection> _section, Action<UnityWebRequest> _downLoadFinish, Action<UnityWebRequest> _downLoadBegin = null, Action<UnityWebRequest, UnityWebRequestTask> _downLoadError = null) { m_Url = _url; m_DownLoadType = _type; m_FormSection = _section; m_DownLoadFinish = _downLoadFinish; if (_downLoadBegin != null) m_DownLoadBegin = _downLoadBegin; if (_downLoadError != null) m_DownLoadError = _downLoadError; } /// <summary> /// 开始下载 /// </summary> /// <returns></returns> public IEnumerator DownLoad() { UnityWebRequest webRequest; switch (m_DownLoadType) { case DownLoadType.GET: webRequest = UnityWebRequest.Get(m_Url); break; case DownLoadType.POST: webRequest = UnityWebRequest.Post(m_Url, m_WWWForm); break; case DownLoadType.POSTMULTIPART: webRequest = UnityWebRequest.Post(m_Url, m_FormSection); break; default: webRequest = new UnityWebRequest("http://www.baidu.com"); break; } //if (m_DownLoadBegin != null) //{ // m_DownLoadBegin(webRequest); //} //等同于非空判断 m_DownLoadBegin?.Invoke(webRequest); webRequest.timeout = 30; yield return webRequest.SendWebRequest(); if (!webRequest.isNetworkError) { m_DownLoadFinish?.Invoke(webRequest); } else { m_DownLoadError?.Invoke(webRequest, this); Debug.LogError("webRequest Error : " + webRequest.error); Debug.LogError("webRequest Error url : " + m_Url); } } }
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public enum DownLoadType
{
NONE,
GET,
POST,
POSTMULTIPART
}
public class UnityWebRequestTask
{
/// <summary>
/// 下载开始
/// </summary>
private Action<UnityWebRequest> m_DownLoadBegin;
/// <summary>
/// 下载结束
/// </summary>
public Action<UnityWebRequest> m_DownLoadFinish;
/// <summary>
/// 下载错误
/// </summary>
private Action<UnityWebRequest, UnityWebRequestTask> m_DownLoadError;
/// <summary>
/// 下载类型
/// </summary>
private DownLoadType m_DownLoadType;
/// <summary>
/// 下载地址
/// </summary>
private string m_Url { get; set; }
private WWWForm m_WWWForm;
/// <summary>
/// 表单参数 和 WWWForm 用法类似
/// 使用方式:
/// m_FormSection.Add(new MultipartFormDataSection("参数1", 参数2));
/// </summary>
private List<IMultipartFormSection> m_FormSection = new List<IMultipartFormSection>();
/// <summary>
/// Get请求传参
/// </summary>
/// <param name="_url">地址</param>
/// <param name="_type">参数类型</param>
/// <param name="_downLoadBegin">开始下载</param>
/// <param name="_downLoadFinish">下载完成</param>
/// <param name="_downLoadError">错误回调</param>
public UnityWebRequestTask(string _url, DownLoadType _type, Action<UnityWebRequest> _downLoadFinish,
Action<UnityWebRequest> _downLoadBegin = null,
Action<UnityWebRequest, UnityWebRequestTask> _downLoadError = null)
{
m_Url = _url;
m_DownLoadType = _type;
if (_downLoadBegin != null)
m_DownLoadBegin = _downLoadBegin;
if (_downLoadError != null)
m_DownLoadError = _downLoadError;
m_DownLoadFinish = _downLoadFinish;
}
/// <summary>
/// Post请求传参
/// </summary>
/// <param name="_url">地址</param>
/// <param name="_type">参数类型</param>
/// <param name="_downLoadBegin">开始下载</param>
/// <param name="_downLoadFinish">下载完成</param>
/// <param name="_downLoadError">错误回调</param>
/// <param name="_form">form参数</param>
public UnityWebRequestTask(string _url, DownLoadType _type, WWWForm _form, Action<UnityWebRequest> _downLoadFinish,
Action<UnityWebRequest> _downLoadBegin = null,
Action<UnityWebRequest, UnityWebRequestTask> _downLoadError = null)
{
m_Url = _url;
m_DownLoadType = _type;
m_WWWForm = _form;
m_DownLoadFinish = _downLoadFinish;
if (_downLoadBegin != null) m_DownLoadBegin = _downLoadBegin;
if (_downLoadError != null) m_DownLoadError = _downLoadError;
}
/// <summary>
/// Post请求传参
/// </summary>
/// <param name="_url">地址</param>
/// <param name="_type">参数类型</param>
/// <param name="_downLoadBegin">开始下载</param>
/// <param name="_downLoadFinish">下载完成</param>
/// <param name="_downLoadError">错误回调</param>
/// <param name="_section">参数</param>
public UnityWebRequestTask(string _url, DownLoadType _type, List<IMultipartFormSection> _section,
Action<UnityWebRequest> _downLoadFinish, Action<UnityWebRequest> _downLoadBegin = null,
Action<UnityWebRequest, UnityWebRequestTask> _downLoadError = null)
{
m_Url = _url;
m_DownLoadType = _type;
m_FormSection = _section;
m_DownLoadFinish = _downLoadFinish;
if (_downLoadBegin != null) m_DownLoadBegin = _downLoadBegin;
if (_downLoadError != null) m_DownLoadError = _downLoadError;
}
/// <summary>
/// 开始下载
/// </summary>
/// <returns></returns>
public IEnumerator DownLoad()
{
UnityWebRequest webRequest;
switch (m_DownLoadType)
{
case DownLoadType.GET:
webRequest = UnityWebRequest.Get(m_Url);
break;
case DownLoadType.POST:
webRequest = UnityWebRequest.Post(m_Url, m_WWWForm);
break;
case DownLoadType.POSTMULTIPART:
webRequest = UnityWebRequest.Post(m_Url, m_FormSection);
break;
default:
webRequest = new UnityWebRequest("http://www.baidu.com");
break;
}
//if (m_DownLoadBegin != null)
//{
// m_DownLoadBegin(webRequest);
//}
//等同于非空判断
m_DownLoadBegin?.Invoke(webRequest);
webRequest.timeout = 30;
yield return webRequest.SendWebRequest();
if (!webRequest.isNetworkError)
{
m_DownLoadFinish?.Invoke(webRequest);
}
else
{
m_DownLoadError?.Invoke(webRequest, this);
Debug.LogError("webRequest Error : " + webRequest.error);
Debug.LogError("webRequest Error url : " + m_Url);
}
}
}

浙公网安备 33010602011771号