Unity UnityWebRequest 学习

记录一下UnityWebRequest学习

UnityWebRequest对象用于与web服务器通信。
unitywebre任务处理与web服务器的HTTP通信流。其他对象——特别是下载处理程序和UploadHandler——分别管理下载和上传数据。
为方便起见,提供了一组静态函数;这些返回UnityWebRequest对象为许多常见用例正确配置。看: Get, Post, Put,
GetTexture.
注意:当UnityWebRequest通过调用Send方法开始与远程服务器通信时,不能改变UnityWebRequest对象上的大多数属性。

UnityWebRequest 架构

UnityWebRequest 由三个元素组成。

  • UploadHandler 处理数据 将数据发送到服务器 的对象

  • DownloadHandler 从服务器接收数据 的对象

  • UnityWebRequest 负责 HTTP 通信流量控制来管理上面两个对象的对象。

API翻译

静态变量

kHttpVerbCREATE字符串“CREATE”,通常用作HTTP CREATE request的动词。
kHttpVerbDELETE字符串“DELETE”,通常用作HTTP DELETErequest的动词。
kHttpVerbGET字符串“GET”,通常用作HTTP GETrequest的动词。
kHttpVerbHEAD字符串“HEAD”,通常用作HTTP HEADrequest的动词。
kHttpVerbPOST字符串“POST”,通常用作HTTP POSTrequest的动词。
kHttpVerbPUT字符串“PUT”,通常用作HTTP PUTrequest的动词。

属性

certificateHandler持有对证书处理程序对象的引用,该对象负责管理UnityWebRequest的证书验证。
chunkedTransfer表示UnityWebRequest系统是否应该采用HTTP/1.1传输编码方法。
disposeCertificateHandlerOnDispose如果为true,那么连接到UnityWebRequest的任何证书处理程序都将拥有证书处理程序。当UnityWebRequest时自动调用,处理。
disposeDownloadHandlerOnDispose如果为true,那么任何连接到这个UnityWebRequest的下载处理程序都将拥有DownloadHandler。当UnityWebRequest时自动调用。处理。
disposeUploadHandlerOnDispose如果为true,任何附加到这个UnityWebRequest的UploadHandler都将拥有UploadHandler。当UnityWebRequest时自动调用,处理。
downloadedBytes 返回系统从远程服务器下载的主体数据的字节数。(只读)
downloadHandler持有一个DownloadHandler对象的引用,该对象管理由这个UnityWebRequest从远程服务器接收的主体数据。
downloadProgress返回0.0到1.0之间的浮点值,指示从服务器下载数据的进度。(只读)
error一种可读的字符串,描述了在处理HTTP请求或响应时,UnityWebRequest对象遇到的任何系统错误。(只读)
isDone在UnityWebRequest完成与远程服务器的通信之后,返回true。(只读)
isHttpError在这个UnityWebRequest收到一个表示错误的HTTP响应代码之后,返回true。(只读)
isModifiable当UnityWebRequest的配置属性可以被改变时,返回true。(只读)
isNetworkError在这个UnityWebRequest遇到系统错误后返回true。(只读)
method定义这个UnityWebRequest使用的HTTP动词(就是上面的静态属性),如GET或POST。
redirectLimit在停止使用“重定向限制超过”系统错误之前,指示UnityWebRequest将遵循的重定向的数量。
responseCode服务器返回的数字HTTP响应代码,如200404或500。(只读)
timeout设置UnityWebRequest在超时数秒后尝试中止。
uploadedBytes返回系统上载到远程服务器主体体数据字节数。(只读)
uploadHandler持有对UploadHandler对象的引用,该对象管理将上传到远程服务器的主体数据。
uploadProgress返回0.0到1.0之间的浮点值,指示将数据上传至服务器的进度。
url定义UnityWebRequest与之通信的目标URL。
useHttpContinue确定这个UnityWebRequest是否包括Expect:100-继续在其传出的请求头中。(默认值:true)。

静态方法

Abort如果有进展,就尽快停止UnityWebRequest。
Dispose这是一种信号,表明这个UnityWebRequest不再被使用,并且应该清理它所使用的任何资源。
GetRequestHeader检索定制请求头的值。
GetResponseHeader从收到的最新HTTP响应中检索响应头的值。
GetResponseHeaders在最新的HTTP响应中检索一个包含这个UnityWebRequest所接收到的所有响应头的字典。
SendWebRequest开始与远程服务器通信。在调用此方法之后,UnityWebRequest将执行DNS解析(如果必要的话),将HTTP请求发送到目标URL的远程服务器并处理服务器的响应。这种方法只能在任何给定的UnityWebRequest对象中调用一次。一旦这个方法被调用,您就不能更改UnityWebRequest的任何属性。这个方法返回一个WebRequestAsyncOperation对象。在一个coroutine中产生WebRequestAsyncOperation会导致coroutine暂停,直到UnityWebRequest遇到系统错误或完成通信。
SetRequestHeader设置一个HTTP请求头到一个定制值。

GET: 请求指定的页面信息,并返回实体主体。
HEAD: 只请求页面的首部。
POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。
PUT: 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE: 请求服务器删除指定的页面。

Get请求:

 IEnumerator Get()
    {
        UnityWebRequest webRequest = UnityWebRequest.Get("http://www.baidu.com");
		webRequest.timeout=10;
        yield return webRequest.SendWebRequest();
       
       if (webRequest.isHttpError||webRequest.isNetworkError)
            Debug.Log(webRequest.error);
        else 
        {
            Debug.Log(webRequest.downloadHandler.text);
        }

    }


post请求

IEnumerator Post()
    {
        WWWForm form = new WWWForm();
        //键值对
        form.AddField("key", "value");
        form.AddField("name","cha");

        UnityWebRequest webRequest = UnityWebRequest.Post("http://www.baidu.com",form);

        yield return webRequest.SendWebRequest();
        if (webRequest.isHttpError||webRequest.isNetworkError)
            Debug.Log(webRequest.error);
        else
        {
            Debug.Log(webRequest.downloadHandler.text);
        }
    }

put请求

IEnumerator Upload()
    {
        byte[] myData = System.Text.Encoding.UTF8.GetBytes("123123");
         UnityWebRequest webRequest = UnityWebRequest.Put("http://www.baidu.com",myData);
            yield return uwr.SendWebRequest();

            if (uwr.isNetworkError || uwr.isHttpError)
            {
                Debug.Log(uwr.error);
            }
            else
            {
                Debug.Log("上传成功!");
            }
        
    }

Head请求

IEnumerator SendRequest1()
{
	UnityWebRequest uwr = UnityWebRequest.Head("http://www.chinar.xin/chinarweb/WebRequest/Get/00-效果.mp4"); //创建UnityWebRequest对象
	yield return uwr.SendWebRequest();                                 //等待返回请求的信息
	if (uwr.isHttpError || uwr.isNetworkError)                         //如果其 请求失败,或是 网络错误
	{
		Debug.Log(uwr.error); //打印错误原因
	}
	else //请求成功
	{
		Debug.Log("Head:请求成功");
	}
}

GetResponseHeader方法

IEnumerator SendRequest1()
{
    UnityWebRequest uwr = UnityWebRequest.Head("http://www.chinar.xin/chinarweb/WebRequest/Get/00-效果.mp4"); //创建UnityWebRequest对象
    yield return uwr.SendWebRequest();                                 //等待返回请求的信息
    if (uwr.isHttpError || uwr.isNetworkError)                         //如果其 请求失败,或是 网络错误
    {
        Debug.Log(uwr.error); //打印错误原因
    }
    else //请求成功
    {
    	long totalLength = long.Parse(huwr.GetResponseHeader("Content-Length")); //首先拿到文件的全部长度
        Debug.Log("totalLength");//打印文件长度
    }
}

下载本地图片

System.Collections.IEnumerator ChangeImageCo()
{
	using (uwr = UnityWebRequestTexture.GetTexture(GetFileLocation(customTextureFilename)))
	{
		yield return uwr.SendWedRequest();
		if(uwr.isNetworkError||uwr.isHttpError)
		{
		   Debug.Log(uwr.error);
		}
		else
		{
			Texture2D tex= DownloadHandlerTexture.GetContent(uwr);
		}
	}
}

下载本地音频(下载WAV格式)

IEnumerator MusicPlayer()
{
	using (uwr = UnityWebRequestMultimedia.GetAudioClip(GetFileLocation(musicFile),AudioType.WAV))
	{
		yield return uwr.SendWebRequest();
		
		if(uwr.isNetworkError||uwr.isHttpError)
		{
		   Debug.Log(uwr.error);
		}
		else
		{
			AudioClip clip=DownloadHandlerAudioClip.GetContent(uwr);
		}
	}

}

下载AssetBundle

private IEnumerator Load()
{
    string url = "";//此为AssetBundle资源路径,可为本地,也可以是服务端
   UnityWebRequest request=  UnityWebRequest.GetAssetBundle(url);
    yield return request.SendWebRequest ();
   		if(uwr.isNetworkError||uwr.isHttpError)
		{
		   Debug.Log(uwr.error);
		}
		else
		{
			AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
		}
    
}

下载文件 断点续传
例子来源:https://blog.csdn.net/linxinfa/article/details/94436027

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

public class ChinarBreakpointRenewal : MonoBehaviour
{
    private bool _isStop;       //是否暂停

    public Slider ProgressBar; //进度条
    public Text SliderValue; //滑动条值
    private Button startBtn;    //开始按钮
    private Button pauseBtn;    //暂停按钮
    public string Url = "http://www.linxinfa.test.mp4";

    /// <summary>
    /// 初始化UI界面及给按钮绑定方法
    /// </summary>
    void Start()
    {
        //初始化进度条和文本框
        ProgressBar.value = 0;
        SliderValue.text = "0.0%";
        startBtn = GameObject.Find("Start Button").GetComponent<Button>();
        startBtn.onClick.AddListener(OnClickStartDownload);
        pauseBtn = GameObject.Find("Pause Button").GetComponent<Button>();
        pauseBtn.onClick.AddListener(OnClickStop);
    }


    /// <summary>
    /// 回调函数:开始下载
    /// </summary>
    public void OnClickStartDownload()
    {
    	// 注意真机上要用Application.persistentDataPath
        StartCoroutine(DownloadFile(Url, Application.streamingAssetsPath + "/MP4/test.mp4", CallBack));
    }


    /// <summary>
    /// 协程:下载文件
    /// </summary>
    /// <param name="url">请求的Web地址</param>
    /// <param name="filePath">文件保存路径</param>
    /// <param name="callBack">下载完成的回调函数</param>
    /// <returns></returns>
    IEnumerator DownloadFile(string url, string filePath, Action callBack)
    {
        UnityWebRequest huwr = UnityWebRequest.Head(url); //Head方法可以获取到文件的全部长度
        yield return huwr.SendWebRequest();
        if (huwr.isNetworkError || huwr.isHttpError) //如果出错
        {
            Debug.Log(huwr.error); //输出 错误信息
        }
        else
        {
            long   totalLength = long.Parse(huwr.GetResponseHeader("Content-Length")); //首先拿到文件的全部长度
            string dirPath     = Path.GetDirectoryName(filePath);
            if (!Directory.Exists(dirPath)) //判断路径是否存在
            {
                Directory.CreateDirectory(dirPath);
            }

            //创建一个文件流,指定路径为filePath,模式为打开或创建,访问为写入
            using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write))
            {
                long nowFileLength = fs.Length; //当前文件长度
                Debug.Log(fs.Length);
                if (nowFileLength < totalLength)
                {
                    Debug.Log("还没下载完成");
                    fs.Seek(nowFileLength, SeekOrigin.Begin);       //从头开始索引,长度为当前文件长度
                    UnityWebRequest uwr = UnityWebRequest.Get(url); //创建UnityWebRequest对象,将Url传入
                    uwr.SetRequestHeader("Range", "bytes=" + nowFileLength + "-" + totalLength);
                    uwr.SendWebRequest();                      //开始请求
                    if (uwr.isNetworkError || uwr.isHttpError) //如果出错
                    {
                        Debug.Log(uwr.error); //输出 错误信息
                    }
                    else
                    {
                        long index = 0;     //从该索引处继续下载
                        while (!uwr.isDone) //只要下载没有完成,一直执行此循环
                        {
                            if (_isStop) break;
                            yield return null;
                            byte[] data = uwr.downloadHandler.data;
                            if (data != null)
                            {
                                long length = data.Length - index;
                                fs.Write(data, (int) index, (int) length); //写入文件
                                index += length;
                                nowFileLength += length;
                                ProgressBar.value = (float) nowFileLength / totalLength;
                                SliderValue.text = Math.Floor((float) nowFileLength / totalLength * 100) + "%";
                                if (nowFileLength >= totalLength) //如果下载完成了
                                {
                                    ProgressBar.value = 1; //改变Slider的值
                                    SliderValue.text = 100 + "%";
                                    callBack?.Invoke();
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    /// <summary>
    /// 下载完成后的回调函数
    /// </summary>
    void CallBack()
    {
        Debug.Log("下载完成");
    }

    /// <summary>
    /// 暂停下载
    /// </summary>
    public void OnClickStop()
    {
        if (_isStop)
        {
            pauseBtn.GetComponentInChildren<Text>().text = "暂停下载";
            Debug.Log("继续下载");
            _isStop = !_isStop;
            OnClickStartDownload();
        }
        else
        {
            pauseBtn.GetComponentInChildren<Text>().text = "继续下载";
            Debug.Log("暂停下载");
            _isStop = !_isStop;
        }
    }
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值