54.UnityWebReq类常用获取数据

54.网络通信-Unity网络类-UnityWebRequest类-常用获取数据


54.1 知识点

UnityWebRequest 是什么?

  • UnityWebRequest 是什么?

    • UnityWebRequest 是 Unity 提供的一个模块化的系统类,用于构建 HTTP 请求和处理 HTTP 响应。
    • 主要目标是实现 Unity 游戏与 Web 服务端的交互,将之前的 WWW 相关功能集成在其中,因此在新版本中建议使用 UnityWebRequest 类来代替 WWW 类。

    注意:

    1. UnityWebRequest 和 WWW 一样,需要配合协程使用。
    2. 支持 http、ftp、file 协议下载或加载资源。
    3. 能够上传文件到 HTTP 资源服务器。

UnityWebRequest 类的常用操作

使用 Get 请求获取文本或二进制数据

使用 Get 请求获取纹理数据

使用 Get 请求获取 AB 包数据

使用 Post 请求发送数据

使用 Put 请求上传数据

Get 获取操作

UnityWebRequest.Get 获取文本或二进制

IEnumerator LoadText()
{
    UnityWebRequest unityWebRequest = UnityWebRequest.Get("http://192.168.1.101:8000/HTTPRoot/test.txt");

    //会等待服务器端响应后 断开连接后 再继续执行后面的内容
    yield return unityWebRequest.SendWebRequest();

    //如果处理成功 结果就是成功枚举
    if (unityWebRequest.result == UnityWebRequest.Result.Success)
    {
        //UnityWebRequest的downloadHandler属性是下载处理器 负责管理由UnityWebRequest从远程服务器接收的主体数据。

        //文本字符串
        print(unityWebRequest.downloadHandler.text);

        //字节数组
        byte[] bytes = unityWebRequest.downloadHandler.data;
        print("字节数组长度" + bytes.Length);
    }
    else
    {
        print("获取失败:" + unityWebRequest.result + unityWebRequest.error + unityWebRequest.responseCode);
    }
}

//获取文本或2进制
StartCoroutine(LoadText());

UnityWebRequest.GetTexture 获取纹理

IEnumerator LoadTexture()
{
    //UnityWebRequest unityWebRequest = UnityWebRequestTexture.GetTexture("http://192.168.1.101:8000/HTTPRoot/pic.png");

    //UnityWebRequest unityWebRequest = UnityWebRequestTexture.GetTexture("ftp://127.0.0.1/pic.png");

    UnityWebRequest unityWebRequest = UnityWebRequestTexture.GetTexture("file://" + Application.streamingAssetsPath + "/test.png");

    yield return unityWebRequest.SendWebRequest();

    if (unityWebRequest.result == UnityWebRequest.Result.Success)
    {
        //可以把UnityWebRequest的downloadHandler属性as成DownloadHandlerTexture纹理下载类得到其中的纹理
        //rawImage.texture = (unityWebRequest.downloadHandler as DownloadHandlerTexture).texture;

        //也可以用DownloadHandlerTexture纹理下载类的GetContent方法传入UnityWebRequest对象得到纹理 这两种方法都可以
        rawImage.texture = DownloadHandlerTexture.GetContent(unityWebRequest);
    }
    else
        print("获取失败" + unityWebRequest.error + unityWebRequest.result + unityWebRequest.responseCode);
}

//获取纹理
StartCoroutine(LoadTexture());

UnityWebRequestAssetBundle.GetAssetBundle 获取AB包

IEnumerator LoadAssetBundle()
{
    UnityWebRequest unityWebRequest = UnityWebRequestAssetBundle.GetAssetBundle("http://192.168.1.101:8000/HTTPRoot/model");

    unityWebRequest.SendWebRequest();

    //在没加载结束前 进行逻辑处理
    while (!unityWebRequest.isDone)
    {
        print(unityWebRequest.downloadProgress);
        print(unityWebRequest.downloadedBytes);
        yield return null;
    }
    //yield return unityWebRequest.SendWebRequest();

    print(unityWebRequest.downloadProgress);
    print(unityWebRequest.downloadedBytes);

    if (unityWebRequest.result == UnityWebRequest.Result.Success)
    {
        //可以把UnityWebRequest的downloadHandler属性as成DownloadHandlerAssetBundleAB包下载类得到其中的AB包
        //AssetBundle assetBundle = (unityWebRequest.downloadHandler as DownloadHandlerAssetBundle).assetBundle;

        //也可以用DownloadHandlerAssetBundleAB包下载类的GetContent方法传入UnityWebRequest对象得到AB包 这两种方法都可以
        AssetBundle assetBundle = DownloadHandlerAssetBundle.GetContent(unityWebRequest);

        print(assetBundle.name);
    }
    else
        print("获取失败" + unityWebRequest.error + unityWebRequest.result + unityWebRequest.responseCode);
}

//获取AB包
StartCoroutine(LoadAssetBundle());

测试结果

总结

  • UnityWebRequest 使用上和 WWW 类很类似。
  • 需要注意:
    • 获取文本或二进制数据时使用 UnityWebRequest.Get。
    • 获取纹理图片数据时使用 UnityWebRequestTexture.GetTexture 以及 DownloadHandlerTexture.GetContent。
    • 获取 AB 包数据时使用 UnityWebRequestAssetBundle.GetAssetBundle 以及 DownloadHandlerAssetBundle.GetContent。

54.2 知识点代码

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

public class Lesson54_网络通信_Unity网络类_UnityWebRequest类_常用获取数据 : MonoBehaviour
{
    public RawImage rawImage;

    void Start()
    {
        #region 知识点一 UnityWebRequest是什么?

        //UnityWebRequest是一个Unity提供的一个模块化的系统类
        //用于构成HTTP请求和处理HTTP响应
        //它主要目标是让Unity游戏和Web服务端进行交互
        //它将之前WWW的相关功能都集成在了其中
        //所以新版本中都建议使用UnityWebRequest类来代替WWW类

        //它在使用上和WWW很类似
        //主要的区别就是UnityWebRequest把下载下来的数据处理单独提取出来了
        //我们可以根据自己的需求选择对应的数据处理对象来获取数据

        //注意:
        //1.UnityWebRequest和WWW一样,需要配合协同程序使用
        //2.UnityWebRequest和WWW一样,支持http、ftp、file协议下载或加载资源
        //3.UnityWebRequest能够上传文件到HTTP资源服务器

        #endregion

        #region 知识点二 UnityWebRequest类的常用操作

        //1.使用Get请求获取文本或二进制数据
        //2.使用Get请求获取纹理数据
        //3.使用Get请求获取AB包数据
        //4.使用Post请求发送数据
        //5.使用Put请求上传数据

        #endregion

        #region 知识点三 Get获取操作

        //获取文本或2进制
        StartCoroutine(LoadText());

        //获取纹理
        StartCoroutine(LoadTexture());

        //获取AB包
        StartCoroutine(LoadAssetBundle());

        #endregion

        #region 总结 

        //UnityWebRequest使用上和WWW类很类似
        //我们需要注意的是
        //1.获取文本或二进制数据时
        //  使用UnityWebRequest.Get
        //2.获取纹理图片数据时
        //  使用UnityWebRequestTexture.GetTexture
        //  以及DownloadHandlerTexture.GetContent
        //3.获取AB包数据时
        //  使用UnityWebRequestAssetBundle.GetAssetBundle
        //  以及DownloadHandlerAssetBundle.GetContent

        #endregion
    }

    #region 知识点三 Get获取操作

    IEnumerator LoadText()
    {
        UnityWebRequest unityWebRequest = UnityWebRequest.Get("http://192.168.1.101:8000/HTTPRoot/test.txt");

        //会等待服务器端响应后 断开连接后 再继续执行后面的内容
        yield return unityWebRequest.SendWebRequest();

        //如果处理成功 结果就是成功枚举
        if (unityWebRequest.result == UnityWebRequest.Result.Success)
        {
            //UnityWebRequest的downloadHandler属性是下载处理器 负责管理由UnityWebRequest从远程服务器接收的主体数据。

            //文本字符串
            print(unityWebRequest.downloadHandler.text);

            //字节数组
            byte[] bytes = unityWebRequest.downloadHandler.data;
            print("字节数组长度" + bytes.Length);
        }
        else
        {
            print("获取失败:" + unityWebRequest.result + unityWebRequest.error + unityWebRequest.responseCode);
        }
    }

    IEnumerator LoadTexture()
    {
        //UnityWebRequest unityWebRequest = UnityWebRequestTexture.GetTexture("http://192.168.1.101:8000/HTTPRoot/pic.png");

        //UnityWebRequest unityWebRequest = UnityWebRequestTexture.GetTexture("ftp://127.0.0.1/pic.png");

        UnityWebRequest unityWebRequest = UnityWebRequestTexture.GetTexture("file://" + Application.streamingAssetsPath + "/test.png");

        yield return unityWebRequest.SendWebRequest();

        if (unityWebRequest.result == UnityWebRequest.Result.Success)
        {
            //可以把UnityWebRequest的downloadHandler属性as成DownloadHandlerTexture纹理下载类得到其中的纹理
            //rawImage.texture = (unityWebRequest.downloadHandler as DownloadHandlerTexture).texture;

            //也可以用DownloadHandlerTexture纹理下载类的GetContent方法传入UnityWebRequest对象得到纹理 这两种方法都可以
            rawImage.texture = DownloadHandlerTexture.GetContent(unityWebRequest);
        }
        else
            print("获取失败" + unityWebRequest.error + unityWebRequest.result + unityWebRequest.responseCode);
    }

    IEnumerator LoadAssetBundle()
    {
        UnityWebRequest unityWebRequest = UnityWebRequestAssetBundle.GetAssetBundle("http://192.168.1.101:8000/HTTPRoot/model");

        unityWebRequest.SendWebRequest();

        //在没加载结束前 进行逻辑处理
        while (!unityWebRequest.isDone)
        {
            print(unityWebRequest.downloadProgress);
            print(unityWebRequest.downloadedBytes);
            yield return null;
        }
        //yield return unityWebRequest.SendWebRequest();

        print(unityWebRequest.downloadProgress);
        print(unityWebRequest.downloadedBytes);

        if (unityWebRequest.result == UnityWebRequest.Result.Success)
        {
            //可以把UnityWebRequest的downloadHandler属性as成DownloadHandlerAssetBundleAB包下载类得到其中的AB包
            //AssetBundle assetBundle = (unityWebRequest.downloadHandler as DownloadHandlerAssetBundle).assetBundle;

            //也可以用DownloadHandlerAssetBundleAB包下载类的GetContent方法传入UnityWebRequest对象得到AB包 这两种方法都可以
            AssetBundle assetBundle = DownloadHandlerAssetBundle.GetContent(unityWebRequest);

            print(assetBundle.name);
        }
        else
            print("获取失败" + unityWebRequest.error + unityWebRequest.result + unityWebRequest.responseCode);
    }

    #endregion
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏