Unity网络

news/2024/10/18 15:07:32/文章来源:https://www.cnblogs.com/comradexiao/p/18474315

基础概念

Unity网络

Unity 发送网络请求UnityWebRequest
UnityWebRequest 提供了一个模块化系统,用于构成 HTTP 请求和处理 HTTP 响应。UnityWebRequest 系统的主要目标是让 Unity 游戏与 Web 浏览器后端进行交互。
基本支持

  • 所有版本的 Unity 编辑器和某些播放器
  • WebGl
  • iOS 和 Android
  • 通用Windows PC端

UnityWebRequest 生态系统将 HTTP 事务分解为三个不同的操作:

  • 向服务器提供数据

  • 从服务器接收数据

  • HTTP 流量控制(例如,重定向和错误处理)

  • UploadHandler 对象处理数据到服务器的传输

  • DownloadHandler 对象处理从服务器接收的数据的接收、缓冲和后处理

  • UnityWebRequest 对象管理其他两个对象,还处理 HTTP 流量控制。此对象是定义自定义标头和 URL 的位置,也是存储错误和重定向信息的位置。

任何 HTTP 事务,正常的代码流程如下:

--- 创建 Web 请求对象
--- 配置 Web 请求对象
------ 设置自定义标头
------ 设置 HTTP 动词(例如 GET、POST 和 HEAD - 除 Android 之外的所有平台都允许使用自定义动词)
------ 设置 URL *(可选)创建上传处理程序并将其附加到 Web 请求
------ 提供要上传的数据
------ 提供要上传的 HTTP 表单 *(可选)创建下载处理程序并将其附加到 Web 请求
--- 发送 Web 请求
------ 如果在协程中,可获得 Send() 调用的结果以等待请求完成 (可选)读取从下载处理程序接收的数据 (可选)从 UnityWebRequest 对象中读取错误信息、HTTP 状态码和响应标头

代码示例

从 HTTP 服务器检索文本或二进制数据 (GET)
因为这里我没有部署 HTTP 文件服务器,所以这里使用的是官方的案例,如果看不太懂可以前往官方文档查看:https://docs.unity.cn/cn/2021.3/Manual/UnityWebRequest-RetrievingTextBinaryData.html
访问百度网址,并获取页面数据

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;public class MyBehaviour : MonoBehaviour
{void Start(){StartCoroutine(GetText());}IEnumerator GetText(){UnityWebRequest www = UnityWebRequest.Get("https://www.baidu.com/");yield return www.SendWebRequest();if (www.result != UnityWebRequest.Result.Success){Debug.Log(www.error);}else{// 以文本形式显示结果Debug.Log(www.downloadHandler.text);// 或者获取二进制数据形式的结果byte[] results = www.downloadHandler.data;}}
}

从 HTTP 服务器检索纹理 (GET)
此处展示的是获取百度 icon 并且将 icon 赋值给游戏对象的纹理, 注意因为是3D的物体,赋值时需要新建个材质保存纹理,再把材质赋值给需要更改的物体。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;public class WWWRequestImg : MonoBehaviour
{private GameObject cube;void  Start(){cube = Resources.Load("Cube1") as GameObject;}public void UnityWebGetImage(){StartCoroutine(GetImage1("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"));}/// <summary>/// 使用UnityWebRequest获取图片/// </summary>/// <param name="url">图片地址</param>/// <returns></returns>public IEnumerator GetImage1(string url){UnityWebRequest www = UnityWebRequestTexture.GetTexture(url);// 请求该网址内容yield return www.SendWebRequest();if(www.result == UnityWebRequest.Result.Success){Texture2D texture = DownloadHandlerTexture.GetContent(www);// 将获取到的内容进行使用Material mat = new Material(Shader.Find("Standard"));mat.mainTexture = texture;GameObject gm = GameObject.Instantiate(cube);gm.transform.position = new Vector3(0, -2, 0);gm.transform.eulerAngles = new Vector3(0, 0, 180);gm.GetComponent<Renderer>().material = mat;}else{Debug.Log("请求失败");}}
}

从 HTTP 服务器下载 AssetBundle (GET)
下载 AB 包是游戏中最常见不过的事了,比如市面上许多大型游戏,在开始时都会检索客户端和服务端的AB包文件是否相同,如果不同则下载对应的AB包进行资源热更新, 像代码的热更新你就可以使用Lua编写代码然后塞到DLL包中。

  • 此函数将创建 UnityWebRequest 并将目标 URL 设置为提供的 URL 参数。此函数还会将 HTTP 动词设置为 GET,但不会设置任何其他标志或自定义标头。
  • 此函数将 DownloadHandlerAssetBundle 附加到 UnityWebRequest。此下载处理程序有一个特殊的 assetBundle 属性,一旦下载和解码了足够的数据,便可使用该属性来提取 AssetBundle,从而允许访问 AssetBundle 中的资源。
  • 如果提供版本号或 Hash128 对象作为参数,也会将这些参数传递给 DownloadHandlerAssetBundle。下载处理程序随后将采用缓存系统。

因为我并没有使用过这种方式获取AB包,所以只能学习官方案例怎么使用

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;public class MyBehaviour : MonoBehaviour {void Start() {StartCoroutine(GetAssetBundle());}IEnumerator GetAssetBundle() {UnityWebRequest www = UnityWebRequestAssetBundle.GetAssetBundle("https://www.my-server.com/myData.unity3d");yield return www.SendWebRequest();if (www.result != UnityWebRequest.Result.Success) {Debug.Log(www.error);}else {AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(www);}}
}

将表单发送到 HTTP 服务器 (POST)
我们先想想,发送 Post 请求,一般需要用什么,首先是一个提交地址,其次是数据表头和数据, 只有满足这两个条件并且,通过服务器验证才会获得相应。
在 Unity 中, Unity提供了一个 IMultipartFormSection 接口由用户实现, Unity 还提供了数据和文件部分的默认实现MultipartFormDataSection 和 MultipartFormFileSection
UnityWebRequest.POST 的重载可接受成员必须全部是 IMultipartFormSections 的列表参数(作为第二个参数)
UnityWebRequest.Post(string url, List<IMultipartFormSection> formSections);

  • 此函数将创建 UnityWebRequest 并将目标 URL 设置为第一个字符串参数。此函数还会为 IMultipartFormSection 对象列表中所指定的表单数据相应设置 UnityWebRequest 的 Content-Type 标头。
  • 默认情况下,此函数将 DownloadHandlerBuffer 附加到 UnityWebRequest。这是为了方便起见,可用于检查服务器的应答。
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using System.Collections.Generic;public class MyBehavior : MonoBehaviour
{void Start(){StartCoroutine(Upload());}IEnumerator Upload(){List<IMultipartFormSection> formData = new List<IMultipartFormSection>();formData.Add(new MultipartFormDataSection("field1=foo&field2=bar"));formData.Add(new MultipartFormFileSection("my file data", "myfile.txt"));UnityWebRequest www = UnityWebRequest.Post("https://www.my-server.com/myform", formData);yield return www.SendWebRequest();if (www.result != UnityWebRequest.Result.Success){Debug.Log(www.error);}else{Debug.Log("Form upload complete!");}}
}

将原始数据上传到 HTTP 服务器 (PUT)

发送原始数据 Unity 提供了两个函数

WebRequest.Put(string url, string data);
WebRequest.Put(string url, byte[] data);

看着很简单,用起来也不难。

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;public class MyBehavior : MonoBehaviour {void Start() {StartCoroutine(Upload());}IEnumerator Upload() {byte[] myData = System.Text.Encoding.UTF8.GetBytes("This is some test data");UnityWebRequest www = UnityWebRequest.Put("https://www.my-server.com/upload", myData);yield return www.SendWebRequest();if (www.result != UnityWebRequest.Result.Success) {Debug.Log(www.error);}else {Debug.Log("Upload complete!");}}
}

创建 UnityWebRequest
与任何其他对象一样,WebRequest 也可以实例化。可使用两个构造函数:

  • 标准的无参数构造函数将创建一个所有设置均为空或默认值的新 UnityWebRequest。此函数中不会设置目标 URL,不会设置自定义标头,并且重定向限制设置为 32。
  • 第二个构造函数采用一个字符串参数。此构造函数将 UnityWebRequest 的目标 URL 分配给字符串参数的值,除此之外,与无参数的构造函数相同。
UnityWebRequest wr = new UnityWebRequest(); // 完全为空
UnityWebRequest wr2 = new UnityWebRequest("https://www.mysite.com"); // 设置目标 URL// 必须提供以下两项才能让 Web 请求正常工作
wr.url = "https://www.mysite.com";
wr.method = UnityWebRequest.kHttpVerbGET;   // 可设置为任何自定义方法,提供了公共常量wr.useHttpContinue = false;
wr.chunkedTransfer = false;
wr.redirectLimit = 0;  // 禁用重定向
wr.timeout = 60;       // 此设置不要太小,Web 请求需要一些时间

创建 UploadHandler

  • 目前,仅一种类型的上传处理程序可用:UploadHandlerRaw。此类在构建时接受数据缓冲区。此缓冲区在内部复制到本机代码内存中,然后当远程服务器准备好接受主体数据时,此缓冲区由 UnityWebRequest 系统使用。
  • 上传处理程序还接受“Content Type”字符串。如果在 UnityWebRequest 自身中没有设置 Content-Type 标头,则此字符串用于 UnityWebRequest 的 Content-Type 标头值。如果在 UnityWebRequest 对象上手动设置了 Content-Type 标头,则将忽略上传处理程序对象上的 Content-Type。
  • 如果没有在 UnityWebRequest 或 UploadHandler 上设置 Content-Type,则系统会将 Content-Type 默认设置为 application/octet-stream。
byte[] payload = new byte[1024];
// ... 使用数据填充有效负载 ...UnityWebRequest wr = new UnityWebRequest("https://www.mysite.com/data-upload");
UploadHandler uploader = new UploadHandlerRaw(payload);// 发送标头:"Content-Type: custom/content-type";
uploader.contentType = "custom/content-type";wr.uploadHandler = uploader;

DownloadHandlers 有多种类型:

  • DownloadHandlerBuffer 用于简单的数据存储。
  • DownloadHandlerFile 用于下载文件并将文件保存到磁盘(内存占用少)。
  • DownloadHandlerTexture 用于下载图像。
  • DownloadHandlerAssetBundle 用于提取 AssetBundle。
  • DownloadHandlerAudioClip 用于下载音频文件。
  • DownloadHandlerMovieTexture 用于下载视频文件。由于 MovieTexture 已被弃用,因此建议您使用 VideoPlayer 进行视频下载和电影播放。
  • DownloadHandlerScript 是一个特殊类。就其本身而言,不会执行任何操作。但是,此类可由用户定义的类继承。此类接收来自UnityWebRequest 系统的回调,然后可以使用这些回调在数据从网络到达时执行完全自定义的数据处理。

此处使用 DownloadHandlerTexture 获取下载的图片

  UnityWebRequest www = UnityWebRequestTexture.GetTexture(url);// 请求该网址内容yield return www.SendWebRequest();if(www.result == UnityWebRequest.Result.Success){Texture2D texture = DownloadHandlerTexture.GetContent(www);// 将获取到的内容进行使用Material mat = new Material(Shader.Find("Standard"));mat.mainTexture = texture;GameObject gm = GameObject.Instantiate(cube);gm.transform.position = new Vector3(0, -2, 0);gm.transform.eulerAngles = new Vector3(0, 0, 180);gm.GetComponent<Renderer>().material = mat;}else{Debug.Log("请求失败");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/816890.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

九点共圆及其圆心证明(证明过程已更新)

九点共圆及其圆心证明主要思路:固定 \(P,L\),证明其它七个点均在以 \(PL\) 为直径的圆上。 条件的来源会备注在括号内。背景可能影响观感,建议打开极简模式阅读。这是一个三角形 \(\triangle ABC\),设 \(BC,AC,AB\) 边上垂足分别为 \(D,E,F\),其边上中点分别为 \(L,M,N\),…

【喜讯】全球电商大数据平台推出F类免费API接口服务!

好消息,全球电商大数据平台再次上线多个类别接口,首次推出F类免费API接口服务,为所有追求数据赋能、寻求创新突破的企业和个人,带来了前所未有的机遇。好消息,值此之际;全球电商大数据平台再次上线多个类别接口,首次推出F类免费API接口服务,为所有追求数据赋能、寻求创…

c# winform在线升级clickonce

说明:在线升级前提 1,一个可以访问在线的地址,2,发布前要在项目属性发布里配置好相关设置 一,可以在IIS上布署一个可以访问的地址 二,发布前配置

SQLSEVER 实现货币数字转中文汉字

SQLSEVER 实现数字转换成中文(货币) -- ============================================= -- Author: LearnerPing -- Create date: 2024/10/18 -- Description: Change Number to Chinese -- ============================================= Create FUNCTION GetNumberToChi…

javascript渲染OFD的库

目前使用javascript开发的OFD的渲染库主要有两个: ofd.js和liteofd,其中ofd.js开发比较早,liteofd是最近刚出现的js库。首先结论是ofd.js渲染效果没有liteofd好,因为ofd.js目前有一些效果没有支持,比如对字体没有比较好的解析和支持。 liteofd相对ofd.js效果更好,并且提供…

高等数学 6.1 定积分的元素法

在定积分的应用中,经常采用所谓的元素法。为了说明这种方法,先回顾一下曲边梯形的面积问题。 设 \(f(x)\) 在区间 \([a, b]\) 上连续且 \(f(x) \geqslant 0\) ,求以曲线 \(y = f(x)\) 为曲边、底为 \([a, b]\) 的曲边梯形的面积 \(A\) 。把这个面积 \(A\) 表示为定积分 \[A …

详解 JuiceFS 在多云架构下的数据同步与一致性

随着大模型流行,GPU 算力资源正变得日益稀缺,传统的“算力跟着存储跑”的策略需要转变为“存储跟着算力跑”。为了确保数据一致性和管理的便捷性,企业通常在特定地区的公有云上选择对象存储作为所有模型数据的集中存储点。当进行计算任务调度时,往往需要人工介入,手动进行…

Renderer

Renderer 模块 Renderer 模块的设置决定了粒子的图像或网格如何被其他粒子变换、着色和过度绘制。 粒子系统Unity中创建粒子系统渲染器模块视图 细节 使用渲染模式在多种 2D Billboard 图形模式和网格模式之间进行选择。当粒子代表固体游戏对象(例如岩石)时,3D 网格赋予粒子…

WDT

参考:https://zhuanlan.zhihu.com/p/711237133 模式 1.WDGIF_FAST_MODE:mode1 2.WDGIF_OFF_MODE:mode2 3.WDGIF_SLOW_MODE:mode0 默认初始化为WDGIF_SLOW_MODE,等待初始化完成后切换成WDGIF_FAST_MODEWDGIF_FAST_MODE设置:问题:反复重启WDGIF_SLOW_MODE模式下,初始化过程…

轻松上手-图片压缩秘籍

作者:狼哥 团队:坚果派 团队介绍:坚果派由坚果等人创建,团队拥有12个华为HDE带领热爱HarmonyOS/OpenHarmony的开发者,以及若干其他领域的三十余位万粉博主运营。专注于分享HarmonyOS/OpenHarmony、ArkUI-X、元服务、仓颉。团队成员聚集在北京,上海,南京,深圳,广州,宁…

记上报信息格式异常问题的解决

本文记述遇到字符串中包含无效字符时的格式化异常问题的全过程。本文记述解决上报信息格式异常问题的全过程。 问题描述 生产环境监控上报无法解析终端信息,通过日志发现是PCN字段前面缺失#号,导致解析程序解析失败。正常情况下,应该展示如下内容:HD1234#PCN1234发生错误情…

云存储图片生成缩略图开发

作者:狼哥 团队:坚果派 团队介绍:坚果派由坚果等人创建,团队拥有12个华为HDE带领热爱HarmonyOS/OpenHarmony的开发者,以及若干其他领域的三十余位万粉博主运营。专注于分享HarmonyOS/OpenHarmony、ArkUI-X、元服务、仓颉。团队成员聚集在北京,上海,南京,深圳,广州,宁…