当前位置: 首页 > news >正文

2025-05-11 Unity 网络基础11——UnityWebRequest 使用

文章目录

  • 1 UnityWebRequest 介绍
  • 2 搭建 HTTP 服务器
  • 3 下载资源
    • 3.1 下载文本
    • 3.2 下载图片
    • 3.3 下载 AB 包
  • 4 上传资源
    • 4.1 上传数据类
    • 4.2 POST 上传
    • 4.3 PUT 上传

1 UnityWebRequest 介绍

​ UnityWebRequest 是 Unity 提供的模块化的系统类,用于构成 HTTP 请求和处理 HTTP 响应。

​ 它主要目标是让 Unity 游戏和 Web 服务端进行交互,将之前 WWW 的相关功能都集成在了其中,新版本中都建议使用 UnityWebRequest 类代替 WWW 类。

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

注意

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

常用操作

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

2 搭建 HTTP 服务器

  • 搭建 HTTP 服务器过程参考:2025-05-11 Unity 网络基础10——HTTP通信-CSDN博客。

​ Unity 默认不允许不安全的连接(如 HTTP),如果服务器是本地开发服务器,可以启用 Unity 的 Allow downloads over HTTP 选项(位于 Edit > Project Settings > Player > Other Settings)。

image-20250511112546176

3 下载资源

3.1 下载文本

  • 获取文本或二进制数据时

    使用 UnityWebRequest.Get()

using UnityEngine;namespace Lesson
{using System.Collections;using UnityEngine.Networking;public class Lesson30 : MonoBehaviour{// 在Start方法中启动LoadText协程private void Start(){StartCoroutine(LoadText());}// 定义LoadText协程IEnumerator LoadText(){// 发送GET请求var req = UnityWebRequest.Get("http://你的 IP 地址:8000/HTTP Server/test.txt");// 等待请求完成yield return req.SendWebRequest();// 如果请求成功if (req.result == UnityWebRequest.Result.Success){// 打印下载的文本print(req.downloadHandler.text);// 获取下载的字节数组var bytes = req.downloadHandler.data;// 打印字节数组的长度print("字节数组长度: " + bytes.Length);}// 如果请求失败else{// 打印错误信息print($"获取失败: {req.error} | {req.result} | {req.responseCode}");}}}
}

​ 将脚本挂载到 Unity 场景上并运行,得到以下结果。

image-20250511112629771

3.2 下载图片

  • 获取纹理图片数据时

    使用 UnityWebRequestTexture.GetTexture()

    以及 DownloadHandlerTexture.GetContent()

    该方法也支持

    • ftp 下载。
    • file 本地文件下载。
using UnityEngine;namespace Lesson
{using System.Collections;using UnityEngine.Networking;using UnityEngine.UI;public class Lesson30 : MonoBehaviour{// 声明一个RawImage类型的变量Imgpublic RawImage Img;// 在Start方法中启动LoadText协程private void Start(){StartCoroutine(LoadTexture());}IEnumerator LoadTexture(){// 创建一个UnityWebRequestTexture对象,用于获取指定URL的纹理var req = UnityWebRequestTexture.GetTexture("http://你的 IP 地址:8000/HTTP Server/test.png");// var req = UnityWebRequestTexture.GetTexture("ftp://你的 IP 地址:8000/HTTP Server/test.png");// var req = UnityWebRequestTexture.GetTexture("file://" + Application.streamingAssetsPath + "/test.png");// 发送网络请求yield return req.SendWebRequest();// 如果请求成功if (req.result == UnityWebRequest.Result.Success){// 方法一// Img.texture = (req.downloadHandler as DownloadHandlerTexture).texture;// 方法二// 获取下载的纹理Img.texture = DownloadHandlerTexture.GetContent(req);}else{// 打印错误信息print($"获取失败: {req.error} | {req.result} | {req.responseCode}");}}}
}

​ 将脚本挂载到 Unity 场景上,并在 Unity 场景中创建一个 RawImage 关联至 Img。

​ 运行 Unity,RawImage 上出现了从服务器下载的图片。

image-20250511114140792

3.3 下载 AB 包

  • 获取 AB 包数据时

    使用 UnityWebRequestAssetBundle.GetAssetBundle()

    以及 DownloadHandlerAssetBundle.GetContent()

using UnityEngine;namespace Lesson
{using System.Collections;using UnityEngine.Networking;using UnityEngine.UI;public class Lesson30 : MonoBehaviour{// 在Start方法中启动LoadText协程private void Start(){StartCoroutine(LoadAB());}IEnumerator LoadAB(){// 创建一个UnityWebRequest对象,用于获取AssetBundleUnityWebRequest req = UnityWebRequestAssetBundle.GetAssetBundle("http://你的 IP 地址:8000/HTTP Server/ab2");// 发送请求req.SendWebRequest();// 循环等待请求完成while (!req.isDone){// 打印下载进度print(req.downloadProgress);// 打印已下载的字节数print(req.downloadedBytes);// 等待一帧yield return null;}//yield return req.SendWebRequest();// 打印下载进度print(req.downloadProgress);// 打印已下载的字节数print(req.downloadedBytes);// 如果请求成功if (req.result == UnityWebRequest.Result.Success){// 获取AssetBundle对象// AssetBundle ab = (req.downloadHandler as DownloadHandlerAssetBundle).assetBundle;// 获取AssetBundle对象var ab = DownloadHandlerAssetBundle.GetContent(req);// 打印AssetBundle的名称print(ab.name);}else{// 打印错误信息print($"获取失败: {req.error} | {req.result} | {req.responseCode}");}}}
}

4 上传资源

4.1 上传数据类

父接口:IMultipartFormSection

  • 所有上传数据类的父接口
  • 可以使用父类容器存储子类对象
var dataList = new List<IMultipartFormSection>();

子类1:MultipartFormDataSection

  • 用于上传普通数据
// 1. 二进制字节数组
dataList.Add(new MultipartFormDataSection(Encoding.UTF8.GetBytes("123123123123123")));// 2. 字符串
dataList.Add(new MultipartFormDataSection("12312312312312312dsfasdf"));// 3. 带参数名和编码类型(常用)
dataList.Add(new MultipartFormDataSection("Name", "xxx", Encoding.UTF8, "application/...."));// 4. 带参数名的字节数组
dataList.Add(new MultipartFormDataSection("Msg", new byte[1024], "appl....."));

子类2:MultipartFormFileSection

  • 用于上传文件数据
// 1. 简单字节数组
dataList.Add(new MultipartFormFileSection(File.ReadAllBytes(Application.streamingAssetsPath + "/test.png")));// 2. 带文件名的字节数组(常用)
dataList.Add(new MultipartFormFileSection("上传的文件.png", File.ReadAllBytes(Application.streamingAssetsPath + "/test.png")));// 3. 字符串数据+文件名(常用)
dataList.Add(new MultipartFormFileSection("12312313212312", "test.txt"));// 4. 带编码格式的字符串数据+文件名(常用)
dataList.Add(new MultipartFormFileSection("12312313212312", Encoding.UTF8, "test.txt"));// 5. 完整参数:表单名+字节数组+文件名+文件类型
dataList.Add(new MultipartFormFileSection("file", new byte[1024], "test.txt", ""));// 6. 完整参数:表单名+字符串数据+编码格式+文件名
dataList.Add(new MultipartFormFileSection("file", "123123123", Encoding.UTF8, "test.txt"));

4.2 POST 上传

基本流程

  1. 准备上传数据列表。
  2. 创建 UnityWebRequest.POST 请求。
  3. 发送请求并监控进度。
  4. 处理响应结果。
using UnityEngine;namespace Lesson
{using System;using System.Collections;using System.Collections.Generic;using System.IO;using UnityEngine.Networking;using UnityEngine.UI;public class Lesson31 : MonoBehaviour{// 在Start方法中启动LoadText协程private void Start(){StartCoroutine(Upload());}IEnumerator Upload(){// 创建一个包含要上传的数据的列表var data = new List<IMultipartFormSection>{// 添加一个名为Name的表单字段,值为xxxnew MultipartFormDataSection("Name", "xxx"),// 添加一个名为png的文件字段,值为test.png文件的内容new MultipartFormFileSection("png", File.ReadAllBytes(Application.streamingAssetsPath + "/test.png")),// 添加一个名为txt的文本字段,值为12312321231232123new MultipartFormFileSection("txt", "12312321231232123"),};// 创建一个POST请求,将数据发送到指定的URLvar req = UnityWebRequest.Post("http://你的 IP 地址:8000/HTTP Server/", data);// 发送请求req.SendWebRequest();// 循环等待请求完成while (!req.isDone){// 打印上传进度print(req.uploadProgress);// 打印已上传的字节数print(req.uploadedBytes);// 等待一帧yield return null;}// 打印上传进度print(req.uploadProgress);// 打印已上传的字节数print(req.uploadedBytes);// 如果请求成功if (req.result == UnityWebRequest.Result.Success){// 打印上传成功print("上传成功");// req.downloadHandler.data}else{// 打印获取失败的信息print($"获取失败: {req.error} | {req.result} | {req.responseCode}");}}}
}

​ 将脚本挂载到 Unity 场景上并运行,得到以下结果。

image-20250511121305306

​ 在服务器文件夹中,可看到上传了 2 个文件(注意要确认可以匿名访问服务器,才可上传成功)。

image-20250511121803853

4.3 PUT 上传

  • 不是所有服务器都支持 PUT 方法。
  • 需要服务器端明确支持 PUT 请求处理。
IEnumerator UploadPut()
{var req = UnityWebRequest.Put("http://你的 IP 地址:8000/HTTP Server/", File.ReadAllBytes(Application.streamingAssetsPath + "/test.png"));yield return req.SendWebRequest();if (req.result == UnityWebRequest.Result.Success){print("Put 上传成功");}else{ }
}
http://www.xdnf.cn/news/393409.html

相关文章:

  • 【数据结构】前言
  • JVM内存结构有哪些?HashMap和HashTable的区别?
  • 编程技能:字符串函数02,strcpy
  • 解决SSH连接华为云服务器ESC经常性断连问题
  • 数据结构实验9.1:静态查找表的基本操作
  • C++:template(函数模板)
  • GitLab搭建与使用(SSH和Docker)两种方式
  • [学习]RTKLib详解:convkml.c、convrnx.c与geoid.c
  • HTTP 错误状态码以及常用解决方案
  • C++进阶--使用红黑树封装map和set
  • 原型链与继承机制:继承背后的秘密
  • Baklib内容中台的核心架构是什么?
  • 蓝桥杯14届国赛 班级活动
  • 反向代理对于 网络安全中服务器的一些思考
  • MiniMind:3块钱成本 + 2小时!训练自己的0.02B的大模型。minimind源码解读、MOE架构
  • JS | 正则 · 常用正则表达式速查表
  • Go语言——kratos微服务框架使用
  • Google语法整理
  • 《软件项目管理》笔记二
  • 从 TTS 到 TTRL:无标签数据强化学习探索与展望
  • CMOS内存的地址空间在主内存空间中吗?
  • Java Solon-MCP 实现 MCP 实践全解析:SSE 与 STDIO 通信模式详解
  • 深入剖析卷积神经网络之卷积层:原理、类型与优化策略
  • Baklib内容管理平台的核心组成是什么?
  • SpringBoot 自动装配原理 自定义一个 starter
  • Android架构模式推荐及分析和MVC架构模式制作一个简单的底部tab切换
  • 嵌入式学习笔记 - STM32 ADC,多重转换,内部参考电压,
  • linux基础操作4------(权限管理)
  • 产业带数据采集方案:1688 API 接口开发与实时数据解析实践
  • 【人工智能】 大模型训练的艺术:从数据到智能的飞跃