Unity中如何将Get请求结果存入变量?解决协程赋值错误
Unity中异步Get请求并获取结果的正确实现方式
这个问题我熟!你遇到的核心问题是协程是异步执行的,StartCoroutine返回的是Coroutine对象,根本不是请求的响应结果,所以直接赋值给string变量肯定会报错。下面给你两种靠谱的修改方案,都是Unity原生支持的:
方案一:使用回调函数(兼容所有Unity版本)
我们可以重构GetRequest方法,让它接受一个回调委托,当请求完成(成功或失败)时,把结果传递给回调函数,再在回调里处理响应内容。
修改后的完整代码
using UnityEngine; using UnityEngine.Networking; public class HttpExample : MonoBehaviour { void Start() { // 启动无参数的Get请求,传入回调处理结果 StartCoroutine(GetRequest("http://httpbin.org/get", OnResponseReceived1)); // 启动带参数的Get请求,传入回调处理结果 StartCoroutine(GetRequest("http://httpbin.org/get", new string[] { "name=john", "surname=doe" }, OnResponseReceived2)); } // 无参数的Get请求协程 IEnumerator GetRequest(string url, System.Action<string, string> callback) { using (UnityWebRequest webRequest = UnityWebRequest.Get(url)) { // 发送请求并等待完成 yield return webRequest.SendWebRequest(); // 处理结果:成功返回响应文本,失败返回错误信息 if (webRequest.result == UnityWebRequest.Result.Success) { callback?.Invoke(webRequest.downloadHandler.text, null); } else { callback?.Invoke(null, webRequest.error); } } } // 带参数的Get请求协程 IEnumerator GetRequest(string url, string[] parameters, System.Action<string, string> callback) { // 将参数拼接成URL查询字符串,特殊字符建议用UnityWebRequest.EscapeURL编码 string queryString = string.Join("&", parameters); string fullUrl = $"{url}?{queryString}"; using (UnityWebRequest webRequest = UnityWebRequest.Get(fullUrl)) { yield return webRequest.SendWebRequest(); if (webRequest.result == UnityWebRequest.Result.Success) { callback?.Invoke(webRequest.downloadHandler.text, null); } else { callback?.Invoke(null, webRequest.error); } } } // 处理第一个请求的响应 void OnResponseReceived1(string response, string error) { if (!string.IsNullOrEmpty(error)) { Debug.LogError($"请求1出错:{error}"); return; } Debug.Log($"请求1响应:{response}"); // 这里可以把response存入变量,做后续逻辑处理 string response1 = response; // ... 你的后续业务代码 } // 处理第二个请求的响应 void OnResponseReceived2(string response, string error) { if (!string.IsNullOrEmpty(error)) { Debug.LogError($"请求2出错:{error}"); return; } Debug.Log($"请求2响应:{response}"); string response2 = response; // ... 你的后续业务代码 } }
关键说明
- 用
using包裹UnityWebRequest,确保请求完成后自动释放资源,避免内存泄漏 - 回调函数
System.Action<string, string>用来接收响应文本和错误信息,成功时错误为null,失败时响应为null - 如果参数包含空格、中文等特殊字符,记得用
UnityWebRequest.EscapeURL()对参数值单独编码,避免URL解析失败
方案二:使用async/await(Unity 2020.1+版本支持)
如果你的Unity版本在2020.1及以上,可以用async/await语法,让代码看起来更像同步逻辑,同时保持异步执行的特性:
修改后的完整代码
using UnityEngine; using UnityEngine.Networking; using System.Threading.Tasks; public class HttpExample : MonoBehaviour { async void Start() { // 等待第一个请求完成,获取结果 var (response1, error1) = await GetRequestAsync("http://httpbin.org/get"); if (!string.IsNullOrEmpty(error1)) { Debug.LogError($"请求1出错:{error1}"); } else { Debug.Log($"请求1响应:{response1}"); // 直接使用response1做后续处理 } // 等待第二个请求完成,获取结果 var (response2, error2) = await GetRequestAsync("http://httpbin.org/get", new string[] { "name=john", "surname=doe" }); if (!string.IsNullOrEmpty(error2)) { Debug.LogError($"请求2出错:{error2}"); } else { Debug.Log($"请求2响应:{response2}"); // 直接使用response2做后续处理 } } // 异步Get请求方法(无参数) async Task<(string response, string error)> GetRequestAsync(string url) { using (UnityWebRequest webRequest = UnityWebRequest.Get(url)) { // 异步等待请求完成 await webRequest.SendWebRequest(); if (webRequest.result == UnityWebRequest.Result.Success) { return (webRequest.downloadHandler.text, null); } else { return (null, webRequest.error); } } } // 异步Get请求方法(带参数) async Task<(string response, string error)> GetRequestAsync(string url, string[] parameters) { string queryString = string.Join("&", parameters); string fullUrl = $"{url}?{queryString}"; return await GetRequestAsync(fullUrl); } }
关键说明
- 把
Start方法改成async void(Unity允许MonoBehaviour的生命周期方法使用async) - 用
Task<(string, string)>返回响应和错误的元组,让代码结构更简洁清晰 await关键字会等待请求完成后再执行后续代码,避免回调嵌套的“回调地狱”问题
重要注意事项
- 确保在PlayerSettings中开启了
Internet Access(默认是允许的,但如果修改过配置要检查) - 务必处理网络异常:比如无网络、请求超时、HTTP 4xx/5xx错误等场景
- 生产环境中建议给请求添加超时时间,避免无限等待:可以用
webRequest.timeout = 10;设置10秒超时
内容的提问来源于stack exchange,提问作者Monke
相关产品推荐
相关产品推荐

