Unity Update 详解

本文详细介绍了Unity中Update、FixedUpdate和LateUpdate的使用和区别。Update和LateUpdate每帧调用一次,而FixedUpdate根据FixedTime调用,用于精确计时的逻辑。在游戏开发中,Update适合处理每帧更新的逻辑,LateUpdate在渲染结束后调用,FixedUpdate则适用于物理模拟和时间精度要求高的场景。

0x01:简介

Unity的脚本继承了Monobehaviour类,在脚本中定义函数:

void FixedUpdate(){}
void Update(){}
void LateUpdate(){}

脚本如果是激活的,这三个函数会被上层逻辑每帧调用,FixedUpdate调用的次数和fixedTime有关,后面详细介绍,Update和LateUpdate每帧调用一次。

0x02:实现

一般游戏流程都类似下面代码示例:

/*****************************************
* Notice:c++ 示例代码,用于说明游戏循环逻辑
* Author:wulongfei
* 
<think>嗯,用户现在问的是UnityWebRequest的详解。之前他们问了关于C#中File.WriteAllBytes的问题,现在转到了Unity的内容,可能是在做游戏开发或者网络应用。需要先确认他们的使用场景,可能是Unity开发者,需要处理网络请求,比如下载资源、与服务器通信等。 首先,UnityWebRequest是Unity中处理网络请求的核心类,相比旧的WWW类更高效灵活。用户可能需要了解基本用法、进阶功能以及常见问题处理。之前的回答结构很详细,分点解析,所以这次也应该保持类似结构,确保信息清晰。 用户可能想知道如何发送GET、POST请求,处理数据,上传下载文件,还有错误处理和性能优化。需要覆盖这些基础内容,同时加入一些实际代码示例,方便他们直接应用。 还要注意Unity的版本差异,比如2017之后的版本推荐使用UnityWebRequest,而之前可能用WWW。另外,UnityWebRequest支持协程,这在Unity中很常见,所以需要提到如何使用协程处理异步请求。 可能用户在实际使用中会遇到证书错误、超时、大文件下载等问题,所以需要包含这些常见问题的解决方法。此外,安全方面,比如HTTPS和头部验证,也是需要注意的点。 性能优化部分,比如缓存策略、断点续传、多线程处理,这些对提升应用性能很重要,特别是处理大量请求时。最后,总结最佳实践,帮助他们避免常见错误,写出更健壮的代码。 需要检查是否有最新的更新,比如Unity 2021后的新功能,但可能用户不一定使用最新版本,所以保持通用性。同时,确保代码示例正确,比如正确处理DownloadHandler和UploadHandler,释放请求对象,避免内存泄漏。 总之,回答要结构清晰,分点详细,涵盖从基础到进阶的内容,提供实用示例和解决方案,帮助用户全面理解UnityWebRequest的使用。</think>以下是关于 **UnityWebRequest** 的深度解析(基于Unity 2021 LTS版本): --- ### 一、核心组件架构 ```csharp UnityWebRequest ├── url (string) // 请求地址 ├── method (string) // GET/POST/PUT等 ├── timeout (int) // 超时时间(秒) ├── redirectLimit (int) // 重定向次数限制 ├── certificateHandler // HTTPS证书处理 ├── uploadHandler (UploadHandler) // 上传数据处理器 └── downloadHandler (DownloadHandler) // 下载数据处理器 ``` --- ### 二、基础请求模式 #### 1. GET请求(文本/JSON) ```csharp IEnumerator GetRequestCoroutine() { using UnityWebRequest req = UnityWebRequest.Get("https://api.example.com/data"); yield return req.SendWebRequest(); if (req.result == UnityWebRequest.Result.Success) { string json = req.downloadHandler.text; Debug.Log($"Received: {json}"); } else { Debug.LogError($"Error: {req.error}"); } } ``` #### 2. POST表单提交 ```csharp WWWForm form = new WWWForm(); form.AddField("username", "user123"); form.AddField("score", "1500"); using UnityWebRequest req = UnityWebRequest.Post(url, form); yield return req.SendWebRequest(); ``` --- ### 三、高级功能实现 #### 1. 大文件分块下载 ```csharp IEnumerator DownloadLargeFile() { var req = new UnityWebRequest(url, UnityWebRequest.kHttpVerbGET); var dh = new DownloadHandlerFile("savePath.dat"); dh.removeFileOnAbort = true; // 中断时删除不完整文件 req.downloadHandler = dh; // 进度监控 while (!req.isDone) { Debug.Log($"Progress: {req.downloadProgress * 100}%"); yield return null; } } ``` #### 2. 自定义证书验证(解决HTTPS错误) ```csharp public class CustomCertHandler : CertificateHandler { protected override bool ValidateCertificate(byte[] certificateData) { // 示例:仅验证特定证书指纹 return GetCertHash(certificateData) == "A1:B2:C3:..."; } } // 使用方式: req.certificateHandler = new CustomCertHandler(); ``` --- ### 四、性能优化技巧 | 优化策略 | 实现方法 | |-------------------------|--------------------------------------------------------------------------| | **连接复用** | 保持长连接:`req.SetRequestHeader("Connection", "Keep-Alive")` | | **缓存控制** | 添加缓存头:`req.SetRequestHeader("Cache-Control", "max-age=3600")` | | **带宽节省** | 使用`DownloadHandlerBuffer` + GZip解压 | | **异步处理** | 搭配UniTask插件实现真正的异步等待 | --- ### 五、错误处理大全 #### 1. 错误类型判断 ```csharp switch (req.result) { case UnityWebRequest.Result.ConnectionError: // 网络连接问题(DNS解析失败、服务器无响应) break; case UnityWebRequest.Result.ProtocolError: // HTTP 4xx/5xx 错误 Debug.Log($"Status Code: {req.responseCode}"); break; case UnityWebRequest.Result.DataProcessingError: // 数据解析失败(如JSON格式错误) break; } ``` #### 2. 超时重试机制 ```csharp int retryCount = 0; while (retryCount < 3) { using var req = UnityWebRequest.Get(url); req.timeout = 5; yield return req.SendWebRequest(); if (req.result != UnityWebRequest.Result.Success) retryCount++; else break; } ``` --- ### 六、实战案例:断点续传 ```csharp IEnumerator ResumeDownload(string url, string savePath) { long existingBytes = new FileInfo(savePath).Length; var req = UnityWebRequest.Get(url); req.SetRequestHeader("Range", $"bytes={existingBytes}-"); var dh = new DownloadHandlerFile(savePath, true); // append模式 req.downloadHandler = dh; yield return req.SendWebRequest(); } ``` --- ### 七、HTTP/2特性支持 Unity 2021+ 支持HTTP/2协议: ```csharp var req = new UnityWebRequest(); req.useHttpContinue = false; // 禁用100 Continue req.uploadHandler = new UploadHandlerRaw(data); req.downloadHandler = new DownloadHandlerBuffer(); req.method = UnityWebRequest.kHttpVerbPOST; req.SetRequestHeader(":method", "POST"); // 显式声明HTTP/2方法 ``` --- ### 八、安全防护建议 1. **防注入攻击** ```csharp // 对URL参数进行编码 string safeUrl = UnityWebRequest.EscapeURL(rawUrl); ``` 2. **头部验证** ```csharp // 检查服务端返回的Content-Type if (!req.GetResponseHeader("Content-Type").Contains("application/json")) { Debug.LogError("Invalid content type"); } ``` 3. **速率限制** ```csharp [SerializeField] float requestInterval = 0.5f; private float lastRequestTime; void Update() { if (Time.time - lastRequestTime > requestInterval) { StartCoroutine(SendRequest()); lastRequestTime = Time.time; } } ``` --- ### 九、与旧版WWW的对比 | 特性 | UnityWebRequest | WWW | |---------------------|-----------------|---------------| | 内存管理 | 精确控制释放 | 自动GC | | 进度获取 | 实时精确 | 每帧更新一次 | | HTTP方法支持 | 完整支持 | 仅GET/POST | | 大文件处理 | 流式传输 | 全内存加载 | | HTTPS控制 | 可自定义证书 | 系统默认 | --- ### 十、最佳实践总结 1. **对象生命周期管理** ```csharp // 正确释放资源 using (UnityWebRequest req = new UnityWebRequest()) { // ... } ``` 2. **协程优化** ```csharp // 避免嵌套协程,使用async/await模式 public async Task<string> FetchDataAsync() { using var req = UnityWebRequest.Get(url); await req.SendWebRequest(); return req.downloadHandler.text; } ``` 3. **多平台适配** ```csharp #if UNITY_ANDROID // Android特殊处理 req.SetRequestHeader("User-Agent", "Custom Android Agent"); #endif ``` 如需处理WebSocket,建议使用 `UnityWebRequest` 的升级版:`UnityWebRequestAssetBundle.GetAssetBundle` 或第三方库如 **Best HTTP/WebSocket**。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值