封装UnityWebRequest

未完待续.....

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using System.IO;

public class QWebRequest : MonoBehaviour
{
    private static QWebRequest instance;
    private static QWebRequest Instance
    {
        get
        {
            return instance ?? (instance = new GameObject("QWebRequest").AddComponent<QWebRequest>());
        }
    }

    #region  startDownload
    /// <summary>
    /// 下载文本
    /// </summary>
    /// <param name="url">请求的链接</param>
    /// <param name="action">发生的事件</param>
    /// <param name="method">请求的方式</param>
    /// <returns></returns>
    public static bool DownloadText(string url, RequestTextEvent action, string method = UnityWebRequest.kHttpVerbGET)
    {
        if (IsNull(url, action, action.action)) return true;
        Instance.StartCoroutine(Instance.DownloadTextIEnumerator( url,method, action));
        return false;
    }

    /// <summary>
    /// 下载数据
    /// </summary>
    /// <param name="url">请求的链接</param>
    /// <param name="action">发生的事件</param>
    /// <param name="method">请求的方式</param>
    /// <returns></returns>
    public static bool DownloadData(string url, RequestDataEvent action, string method = UnityWebRequest.kHttpVerbGET)
    {
        if (IsNull(url, action, action.action)) return true;
        Instance.StartCoroutine(Instance.DownloadDataIEnumerator(url,method,action));
        return false;
    }

    /// <summary>
    /// 下载文件[文件存放位置不能重复]
    /// </summary>
    /// <param name="url">请求的链接</param>
    /// <param name="savePath">保存的路径</param>
    /// <param name="action">发生的事件</param>
    /// <param name="method">请求的方式</param>
    /// <returns></returns>
    public static bool DownloadFile(string url, string savePath, RequestFileEvent action, string method = UnityWebRequest.kHttpVerbGET)
    {
        if(string.IsNullOrEmpty(url) || action==null)return true;
        Instance.StartCoroutine(Instance.DownloadFileIEnumerator(url,savePath,method,action));
        return false;
    }

    /// <summary>
    /// 下载图片
    /// </summary>
    /// <param name="url">请求的链接</param>
    /// <param name="action">发生的事件</param>
    /// <param name="method">请求的方式</param>
    /// <returns></returns>
    public static bool DownaloadSprite(string url, RequestSpriteEvent action, string method = UnityWebRequest.kHttpVerbGET)
    {
        if (IsNull(url, action, action.action)) return true;
        Instance.StartCoroutine(Instance.DownloadSpriteIEnumerator(url,method,action));
        return false;
    }

    /// <summary>
    /// 下载AssetBundle
    /// </summary>
    /// <param name="url">请求的链接</param>
    /// <param name="action">发生的事件</param>
    /// <param name="method">请求的方式</param>
    /// <returns></returns>
    public static bool DownaloadAssetBundle(string url, RequestAssetBundleEvent action, string method = UnityWebRequest.kHttpVerbGET)
    {
        if (IsNull(url, action, action.action)) return true;
        Instance.StartCoroutine(Instance.DownloadAssetBundleIEnumerator(url,method,action));
        return false;
    }

    /// <summary>
    /// 下载音频
    /// </summary>
    /// <param name="url">请求的链接</param>
    /// <param name="audioType">音频格式</param>
    /// <param name="action">发生的事件</param>
    /// <returns></returns>
    public static bool DownloadAudioClip(string url, RequestAudioClipEvent action, AudioType audioType=AudioType.AUDIOQUEUE)
    {
        if (IsNull(url, action, action.action)) return true;
        Instance.StartCoroutine(Instance.DownloadAudioClipIEnumerator(url,audioType,action));
        return false;
    }

    /// <summary>
    /// 下载视频
    /// </summary>
    /// <param name="url">请求的链接</param>
    /// <param name="action">发生的事件</param>
    /// <returns></returns>
    public static bool DownloadMovieTexture(string url, RequestMovieTextureEvent action)
    {
        if (IsNull(url, action, action.action)) return true;
        Instance.StartCoroutine(Instance.DownloadMovieTextureIEnumerator(url,action));
        return false;
    }
    #endregion

    IEnumerator DownloadTextIEnumerator(string url, string method, RequestTextEvent action)
    {
        var request = new UnityWebRequest(url, method);
        request.downloadHandler = new DownloadHandlerBuffer();
        if(action.downloadProgress!=null) StartCoroutine(DownloadProgress(request, action.downloadProgress));
        yield return request.SendWebRequest();
        Dispose(request,() =>
        {
            action.action(request.downloadHandler.text);
        }, action.error, action.error404, action.error500);
    }

    IEnumerator DownloadDataIEnumerator( string url, string method, RequestDataEvent action)
    {
        var request = new UnityWebRequest(url, method);
        request.downloadHandler = new DownloadHandlerBuffer();
        if(action.downloadProgress!=null) StartCoroutine(DownloadProgress(request, action.downloadProgress));
        yield return request.SendWebRequest();
        Dispose(request,() =>
        {
            action.action(request.downloadHandler.data);
        }, action.error, action.error404, action.error500);
    }

    IEnumerator DownloadFileIEnumerator(string url, string savePath, string method, RequestFileEvent action)
    {
        if (!File.Exists(savePath))
        {
            var request = new UnityWebRequest(url, method);
            request.downloadHandler = new DownloadHandlerFile(savePath);
            if (action.downloadProgress != null) StartCoroutine(DownloadProgress(request, action.downloadProgress));
            yield return request.SendWebRequest();
            Dispose(request, () =>
             {
                 Debug.Log("File successfully downloaded and saved to " + savePath);
                 if (action != null) action.action();
             }, action.error, action.error404, action.error500);
        }else{
            action.failedCreateFile();
        }
    }

    IEnumerator DownloadSpriteIEnumerator(string url, string method, RequestSpriteEvent action)
    {
        var request = new UnityWebRequest(url, method);
        var texDl = new DownloadHandlerTexture(true);
        request.downloadHandler = texDl;
        if(action.downloadProgress!=null) StartCoroutine(DownloadProgress(request, action.downloadProgress));

        yield return request.SendWebRequest();
        Dispose(request,() =>
        {
            Texture2D t = texDl.texture;
            action.action(Sprite.Create(t, new Rect(0, 0, t.width, t.height), Vector2.zero, 1f),texDl.data);
        }, action.error, action.error404, action.error500);
    }

    IEnumerator DownloadAssetBundleIEnumerator(string url, string method, RequestAssetBundleEvent action)
    {
        var request = new UnityWebRequest(url, method);
        var handler = new DownloadHandlerAssetBundle(request.url, uint.MaxValue);
        request.downloadHandler = handler;
        if(action.downloadProgress!=null) StartCoroutine(DownloadProgress(request, action.downloadProgress));

        yield return request.SendWebRequest();
        Dispose(request,() =>
        {
            action.action(handler.assetBundle);
        }, action.error, action.error404, action.error500);
    }

    IEnumerator DownloadAudioClipIEnumerator(string url, AudioType audioType, RequestAudioClipEvent action)
    {
        var request = UnityWebRequestMultimedia.GetAudioClip(url, audioType);
        if(action.downloadProgress!=null) StartCoroutine(DownloadProgress(request, action.downloadProgress));

        yield return request.SendWebRequest();

        Dispose(request,() =>
        {
            action.action(DownloadHandlerAudioClip.GetContent(request));
        }, action.error, action.error404, action.error500);
    }


    IEnumerator DownloadMovieTextureIEnumerator(string url, RequestMovieTextureEvent action)
    {
        var request = UnityWebRequestMultimedia.GetMovieTexture(url);
        if(action.downloadProgress!=null) StartCoroutine(DownloadProgress(request, action.downloadProgress));
        yield return request.SendWebRequest();
        Dispose(request,() =>
        {
            action.action(DownloadHandlerMovieTexture.GetContent(request));
        }, action.error, action.error404, action.error500);
    }

    IEnumerator DownloadProgress(UnityWebRequest request, Action<float> action)
    {
        while (!request.isDone)
        {

            yield return null;
            action(request.downloadProgress);

        }
        request.Abort();
        Resources.UnloadUnusedAssets();
    }

    private void Dispose(UnityWebRequest request,Action ok, Action<string> error, Action error404, Action error500)
    {
        QDebug.Log(string.Format("url [ {0} ]\nerror [ {1} ]",request.url,request.error));
        if (request.isHttpError || request.isNetworkError)
        {
            if (error != null) error(request.error);
        }
        else
        {
            switch (request.responseCode)
            {
                case 200: if (ok != null) ok(); break;
                case 404: if (error404 != null) error404(); break;
                case 500: if (error500 != null) error500(); break;
            }
        }
    }

    private static bool IsNull(string url, BaseRequestEvent requestAction, object action)
    {
        if (string.IsNullOrEmpty(url) || requestAction == null || action == null)
        {
            QDebug.Log("Can't be empty");
            return true;
        }
        return false;
    }

    public class BaseRequestEvent
    {
        public Action<float> downloadProgress;
        public Action<string> error;
        public Action error404;
        public Action error500;
    }

    /// <summary>
    /// 文本请求事件
    /// </summary>
    public class RequestTextEvent : BaseRequestEvent
    {
        public Action<string> action;
    }

    /// <summary>
    /// 数据请求事件
    /// </summary>
    public class RequestDataEvent : BaseRequestEvent
    {
        public Action<byte[]> action;
    }

    /// <summary>
    /// 文件请求事件
    /// </summary>
    public class RequestFileEvent:BaseRequestEvent
    {
        public Action action;
        public Action failedCreateFile;
    }

    /// <summary>
    /// 图片请求事件
    /// </summary>
    public class RequestSpriteEvent : BaseRequestEvent
    {
        public Action<Sprite,byte[]> action;
    }

    /// <summary>
    /// 文本请求事件
    /// </summary>
    public class RequestAssetBundleEvent : BaseRequestEvent
    {
        public Action<AssetBundle> action;
    }

    /// <summary>
    /// 音频请求事件
    /// </summary>
    public class RequestAudioClipEvent : BaseRequestEvent
    {
        public Action<AudioClip> action;
    }

    /// <summary>
    /// 视频请求事件
    /// </summary>
    public class RequestMovieTextureEvent : BaseRequestEvent
    {
        public Action<MovieTexture> action;
    }


}

猜你喜欢

转载自blog.csdn.net/qq_17813937/article/details/79783665