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 把下载下来的数据处理单独提取出来,可以根据自己的需求选择对应的数据处理对象来获取数据。
注意
- UnityWebRequest 和 WWW 一样,需要配合协同程序使用。
- UnityWebRequest 和 WWW 一样,支持 http、ftp、file 协议下载或加载资源。
- UnityWebRequest 能够上传文件到 HTTP 资源服务器。
常用操作
- 使用 Get 请求获取文本或二进制数据。
- 使用 Get 请求获取纹理数据。
- 使用 Get 请求获取 AB 包数据。
- 使用 Post 请求发送数据。
- 使用 Put 请求上传数据。
2 搭建 HTTP 服务器
- 搭建 HTTP 服务器过程参考:2025-05-11 Unity 网络基础10——HTTP通信-CSDN博客。
Unity 默认不允许不安全的连接(如 HTTP),如果服务器是本地开发服务器,可以启用 Unity 的 Allow downloads over HTTP
选项(位于 Edit > Project Settings > Player > Other Settings
)。

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 场景上并运行,得到以下结果。

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 上出现了从服务器下载的图片。

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 上传
基本流程
- 准备上传数据列表。
- 创建
UnityWebRequest.POST
请求。 - 发送请求并监控进度。
- 处理响应结果。
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 场景上并运行,得到以下结果。

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

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{ }
}