You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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关键字会等待请求完成后再执行后续代码,避免回调嵌套的“回调地狱”问题

重要注意事项

  1. 确保在PlayerSettings中开启了Internet Access(默认是允许的,但如果修改过配置要检查)
  2. 务必处理网络异常:比如无网络、请求超时、HTTP 4xx/5xx错误等场景
  3. 生产环境中建议给请求添加超时时间,避免无限等待:可以用webRequest.timeout = 10;设置10秒超时

内容的提问来源于stack exchange,提问作者Monke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:29:47