UnityWebRequest进度条设计(Unity取代WWW的方案?)

这两天逛Unity api时,发现UnityWebRequest,官方文档介绍看这里。,脚本api看这里。WWW存在很多问题。
其中之一,www在ios下大文件存在缺陷。如果你们对于http的header部分操作频繁的话,就会出现头痛的事情了。

1、字符集编码。很难控制。有时只能让服务器妥协一下。
2、header的大小写问题。有时会出现大小写字符改变的问题,注意是“有时”,这种非必现的问题,往往是痛苦的根源啊……
现在有了UnityWebRequest,就可以方便的实现一些以前难实现的功能。
以前实现进度条功能,可以在yield return www之前用while循环获得下载进度。这样会阻塞程序。如果东西很大,还可能会造成卡顿。
现在我用UnityWebRequest实现了一个进度条。我们先看效果:


DownLoad.gif

unity在5.4之后的版本才添加这个api,所以在用5.4以上的unity使用,我这里用的是unity2017.2的版本。上代码:

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

public class WebRequest : MonoBehaviour {

    public Slider slider;
    public Text text;//内容显示
    public Text progressText;//进度显示

    void Start()    {
        StartCoroutine(GetText());
    }
    IEnumerator GetText()    {
        using (UnityWebRequest uwr = UnityWebRequest.Get("https://nj01ct01.baidupcs.com/file/dbd83a3df9b920e7706cd0cca15ff6a8?bkt=p3-1400dbd83a3df9b920e7706cd0cca15ff6a8f7449fac00000019680a&fid=3423361126-250528-364549440400582&time=1514252723&sign=FDTAXGERLQBHSK-DCb740ccc5511e5e8fedcff06b081203-Mh6xyHm3%2Fqt7X6cRxEw50X%2BLj4Q%3D&to=63&size=1665034&sta_dx=1665034&sta_cs=1&sta_ft=txt&sta_ct=0&sta_mt=0&fm2=MH,Yangquan,Anywhere,,guangdong,ct&vuk=3423361126&iv=0&newver=1&newfm=1&secfm=1&flow_ver=3&pkey=1400dbd83a3df9b920e7706cd0cca15ff6a8f7449fac00000019680a&sl=74317902&expires=8h&rt=pr&r=496061556&mlogid=8335651897587839115&vbdid=481251059&fin=test.txt&fn=test.txt&rtype=1&dp-logid=8335651897587839115&dp-callid=0.1.1&hps=1&tsl=177&csl=177&csign=aThxLmvlcWV08TOj13LIu308UFo%3D&so=0&ut=6&uter=4&serv=0&uc=3885765770&ic=3860577397&ti=5e666840c78f1973cbe71d11839bdeeaa56ae1a366feac0c305a5e1275657320&by=themis"))
        {
            uwr.SendWebRequest();//开始请求
            while (!uwr.isDone)
            {
                //Debug.LogError(www.downloadProgress);
                slider.value = uwr.downloadProgress;//展示下载进度
                progressText.text = Math.Floor(uwr.downloadProgress * 100) + "%";
                yield return 1;
            }
            if (uwr.isDone)
            {
                progressText.text = 100 + "%";
                slider.value = 1;
            }
            if (uwr.isNetworkError || uwr.isHttpError)
            {
                Debug.Log(uwr.error);
            }
            else
            {
                //显示下载后的文本数据
                Debug.Log(uwr.downloadHandler.text);
                text.text = uwr.downloadHandler.text;
                byte[] results = uwr.downloadHandler.data;
            }
        }
    }
}

SendWebRequest()之后,就会触发一个请求。之后的操作会在unity主线程里开始请求数据。
附工程地址:
链接:https://pan.baidu.com/s/1pLh0IhH 密码:tnuw

你可能感兴趣的:(UnityWebRequest进度条设计(Unity取代WWW的方案?))