zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    }

    /********************************************* * *   Title: UnityWebRequest下载列表 * *   Description: 封装 控制UnityWebRequest 下载的Post请求 Get请求 * *   Author: jin * *   Date: 2019.7.1 * *   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);        }    }}

  • 相关阅读:
    13种状况不宜立即止损
    市场运行趋势该如何研判
    炒股的九重境界
    标准止损法
    又感冒了
    量价分析之毕生经验之谈
    您的电池出现问题,因此可能导致您的计算机突然关机 出现红色X
    《股票大作手操盘术》读书笔记
    Spring.NET学习笔记——目录(原)
    Spring.NET实用技巧2——NHibernate访问Oracle数据库
  • 原文地址:https://www.cnblogs.com/jbw752746541/p/11116298.html
Copyright © 2011-2022 走看看