文章目录
- 一、前言
- 二、最简单的GET请求
- 三、下载图片并显示
- 四、POST请求(发送数据给服务器)
- 五、显示下载进度
- 六、错误处理
- 七、常用下载类型
- 八、完整示例:图片下载器
- 九、注意事项
一、前言
网络占据我们生活中的绝大部分!Unity中也有一个非常重要的网络请求工具——UnityWebRequest,那么这篇文章就是说一下的UnityWebRequest的使用,让项目更上一个台阶。
首先说一下什么是UnityWebRequest?它是Unity提供的一个现代化网络请求系统,就像你的手机浏览器一样,只不过是在游戏里工作!它大致可以实现下面的几种类型的功能:
- 从网上下载东西(图片、音频、视频等)
- 向服务器发送数据
- 上传文件
- 处理网页请求
二、最简单的GET请求
以练促学,先看一个最简单的例子——从网上下载文字
usingUnityEngine;usingUnityEngine.Networking;usingSystem.Collections;publicclassSimpleWebRequest:MonoBehaviour{voidStart(){StartCoroutine(GetText());}IEnumeratorGetText(){// 1. 创建一个请求UnityWebRequestrequest=UnityWebRequest.Get("https://example.com");// 2. 发送请求并等待完成yieldreturnrequest.SendWebRequest();// 3. 检查结果if(request.result==UnityWebRequest.Result.Success){Debug.Log("下载成功:"+request.downloadHandler.text);}else{Debug.Log("下载失败:"+request.error);}}}代码解析:
UnityWebRequest.Get(url)- 创建一个GET请求yield return request.SendWebRequest()- 发送请求并等待完成request.downloadHandler.text- 获取下载的文字内容
三、下载图片并显示
现在我们来下载一张图片并显示在UI上:
IEnumeratorDownloadImage(){// 1. 创建图片请求UnityWebRequestrequest=UnityWebRequestTexture.GetTexture("https://example.com/image.jpg");// 2. 发送请求yieldreturnrequest.SendWebRequest();// 3. 处理结果if(request.result==UnityWebRequest.Result.Success){// 获取下载的纹理Texture2Dtexture=DownloadHandlerTexture.GetContent(request);// 创建Sprite并显示在UI上Spritesprite=Sprite.Create(texture,newRect(0,0,texture.width,texture.height),newVector2(0.5f,0.5f));GetComponent<Image>().sprite=sprite;}else{Debug.LogError("图片下载失败:"+request.error);}}四、POST请求(发送数据给服务器)
有时候我们需要向服务器发送数据,比如登录信息:
IEnumeratorLogin(stringusername,stringpassword){// 1. 创建表单数据WWWFormform=newWWWForm();form.AddField("username",username);form.AddField("password",password);// 2. 创建POST请求UnityWebRequestrequest=UnityWebRequest.Post("https://example.com/login",form);// 3. 发送请求yieldreturnrequest.SendWebRequest();// 4. 处理响应if(request.result==UnityWebRequest.Result.Success){Debug.Log("登录成功:"+request.downloadHandler.text);}else{Debug.LogError("登录失败:"+request.error);}}五、显示下载进度
让我们给下载添加一个进度条:
publicSliderprogressBar;publicTextprogressText;IEnumeratorDownloadWithProgress(){UnityWebRequestrequest=UnityWebRequest.Get("https://example.com/bigfile.zip");// 开始下载varoperation=request.SendWebRequest();// 更新进度条while(!operation.isDone){progressBar.value=request.downloadProgress;progressText.text=(request.downloadProgress*100).ToString("F0")+"%";yieldreturnnull;}if(request.result==UnityWebRequest.Result.Success){Debug.Log("下载完成!");}}六、错误处理
网络请求可能会失败,我们需要正确处理各种错误:
if(request.result==UnityWebRequest.Result.Success){// 成功处理}elseif(request.result==UnityWebRequest.Result.ConnectionError){Debug.LogError("网络连接错误:"+request.error);}elseif(request.result==UnityWebRequest.Result.ProtocolError){Debug.LogError("服务器返回错误:"+request.responseCode);}elseif(request.result==UnityWebRequest.Result.DataProcessingError){Debug.LogError("数据处理错误:"+request.error);}七、常用下载类型
UnityWebRequest支持下载各种类型的内容:
| 类型 | 创建方法 | 获取内容方法 |
|---|---|---|
| 文本 | UnityWebRequest.Get(url) | request.downloadHandler.text |
| 图片 | UnityWebRequestTexture.GetTexture(url) | DownloadHandlerTexture.GetContent(request) |
| 音频 | UnityWebRequestMultimedia.GetAudioClip(url, AudioType.MPEG) | DownloadHandlerAudioClip.GetContent(request) |
| AssetBundle | UnityWebRequestAssetBundle.GetAssetBundle(url) | DownloadHandlerAssetBundle.GetContent(request) |
八、完整示例:图片下载器
usingUnityEngine;usingUnityEngine.UI;usingUnityEngine.Networking;usingSystem.Collections;publicclassImageDownloader:MonoBehaviour{publicInputFieldurlInput;publicImagedisplayImage;publicSliderprogressBar;publicTextstatusText;publicvoidStartDownload(){StartCoroutine(DownloadImage(urlInput.text));}IEnumeratorDownloadImage(stringurl){statusText.text="准备下载...";progressBar.value=0;using(UnityWebRequestrequest=UnityWebRequestTexture.GetTexture(url)){// 开始下载varoperation=request.SendWebRequest();statusText.text="下载中...";// 更新进度while(!operation.isDone){progressBar.value=request.downloadProgress;yieldreturnnull;}// 处理结果if(request.result==UnityWebRequest.Result.Success){Texture2Dtexture=DownloadHandlerTexture.GetContent(request);Spritesprite=Sprite.Create(texture,newRect(0,0,texture.width,texture.height),Vector2.one*0.5f);displayImage.sprite=sprite;statusText.text="下载完成!";}else{statusText.text="下载失败:"+request.error;}}}}九、注意事项
- 一定要用协程:网络请求必须放在
IEnumerator中,使用yield return等待完成 - 用完要清理:使用
using语句或手动调用request.Dispose() - Android权限:在Android上需要添加网络权限(在Player Settings中)
- WebGL限制:WebGL有特殊限制,需要使用特定方式处理
- 检查请求状态: 请求后要检查请求是否成功,如果请求都没有成功,那么后续的操作也毫无意义
- 错误处理: 添加对应的错误处理