测试版本2018.2.9f1,请不要使用5.3.5版本的unitywebrequest!
新版本的unity推出了UnityWebRequest请求方式。UnityWebRequest提供了一个模块化的系统来提供HTTP请求和处理HTTP响应。而之前的www请求方式正在被unity弃用。
Http请求流程:
- 创建一个Web Request(UnityWebRequest)
- 配置Web Request
- 设置自定义头
- 设置请求方式 (Get Post)
- 设置地址
- 创建一个上传处理程序并附加到Web Request
- 提供要上传的数据
- 提供要上传的HTTP表单
- 创建一个下载处理程序并附加到Web Request
- 发送web请求 在协程里使用Send()方法并等待请求数据结束
- 读取下载程序返回的数据(DownloadHandler)
- 从UnityWebRequest对象中读取错误信息、HTTP状态代码和响应头
常规请求(请求文本):
IEnumerator Send(string url)
{
UnityWebRequest request=UnityWebRequest.Get(url);
yield return request.SendWebRequest();
if (request.isHttpError || request.isNetworkError)
{
UnityEngine.Debug.Log(request.error);
}
else
{
UnityEngine.Debug.Log(request.downloadHandler.text);
}
}
加载AssetBundle
最近查看unity文档以及实际编码发现unity的api迭代速度有点快。官方文档推荐的方法在编辑器里提示过时。所以还是要根据不同版本来测试加载ab包的方法。2018.2.9版本加载ab包代码如下:
IEnumerator GetAssetBundle(string url)
{
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(path);
yield return request.SendWebRequest();
if (request.isDone)
{
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
if (ab)
{
Instantiate(ab.LoadAsset("Cube"));
}
}
request.Dispose();//记得使用完要释放呀
}
之前看到的用get请求回来后进行强转是不可行的,实例如下:
UnityWebRequest request
//不可行 会报无法将源类型转换为目标类型
DownloadHandlerAssetBundle da = request.downloadHandler as DownloadHandlerAssetBundle;
if (da != null && da.assetBundle != null)
{
AssetBundle ab = da.assetBundle;
}
加载图片
加载图片的代码如下:
UnityWebRequest www = UnityWebRequestTexture.GetTexture("http://www.my-server.com/image.png");
yield return www.SendWebRequest();
if(www.isNetworkError || www.isHttpError) {
Debug.Log(www.error);
}
else {
Texture myTexture = ((DownloadHandlerTexture)www.downloadHandler).texture;
}
www.Dispose();//记得使用完要释放呀
也可以使用如下方法获取图片
IEnumerator GetTexture() {
UnityWebRequest www = UnityWebRequestTexture.GetTexture("http://www.my-server.com/image.png");
yield return www.SendWebRequest();
Texture myTexture = DownloadHandlerTexture.GetContent(www);
}
之后对UnityWebRequest 有什么新的认识会及时更新。
由于请求不同类型的文件所使用的类不同,所以如果做网络请求管理类的时候,需要传入请求类型了。(比如:文本或者ab包或者贴图)然后根据不同类型做不同的代码请求。
当我们下载数据过大超时时,www.isNetworkError会变成true。
在拼接地址的时候我们很容易出错,我们可以使用System.Uri这个类。代码如下:
IEnumerator UriDemo()
{
var uri = new System.Uri(Path.Combine(Application.streamingAssetsPath, "data.json"));
var request = UnityWebRequest.Get(uri.AbsoluteUri);
yield return request.SendWebRequest();
if (request.isNetworkError || request.isNetworkError)
{
Debug.Log(request.error);
}
else
{
Debug.Log(request.downloadHandler.text);
}
}
不同平台下的地址并不相同:
- Windows平台
file:///D:/DATA/StreamingAssets/data.json
- WebGl平台
http://localhost/StreamingAssets/data.json
- Android平台
jar:file:///data/app/xxx!/assets/data.json