Unity3D开发之UnityWebRequest请求

测试版本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

你可能感兴趣的:(Unity)