这两天逛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
网友评论