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

Unity:如何让主线程等待WWW加载远程JSON完成或超时?

在Unity中同步等待WWW类的响应(正确姿势)

嘿,我明白你想在继续执行代码前等待WWW请求完成的需求——官方示例的异步写法确实容易让人困惑,而且直接阻塞主线程的做法会导致游戏卡死,这里给你几个靠谱的解决方案:

1. 推荐:使用协程(Coroutine)实现“伪同步”等待

协程是Unity处理异步操作的标准方式,它能让你写出看起来像同步的代码,但不会阻塞主线程。你只需要用yield return www来等待请求完成,之后再处理返回的JSON数据:

using UnityEngine;
using System.Collections;

public class JsonFetcher : MonoBehaviour
{
    void Start()
    {
        // 启动协程来获取JSON
        StartCoroutine(FetchJsonCoroutine("你的远程JSON URL"));
        // 这里的代码会继续执行,不会等待协程完成
    }

    IEnumerator FetchJsonCoroutine(string url)
    {
        WWW www = new WWW(url);
        
        // 等待请求完成,这一步不会阻塞主线程
        yield return www;

        // 请求完成后处理结果
        if (string.IsNullOrEmpty(www.error))
        {
            // 获取到JSON数据,解析它
            string jsonData = www.text;
            Debug.Log("JSON获取成功:" + jsonData);
            // 这里可以继续执行依赖JSON的逻辑
            ProcessJson(jsonData);
        }
        else
        {
            Debug.LogError("请求失败:" + www.error);
        }
    }

    void ProcessJson(string json)
    {
        // 你的JSON解析逻辑
    }
}

2. 不推荐:同步阻塞的方式(谨慎使用)

如果你非要在主线程里同步等待(强烈不建议,会导致游戏卡顿甚至无响应),可以结合yield return null让主线程每帧留出处理时间,循环检查请求状态:

IEnumerator FetchJsonSync(string url)
{
    WWW www = new WWW(url);
    
    // 循环等待直到完成,但每帧让出主线程资源
    while (!www.isDone)
    {
        // 这一步是核心,没有它主线程会彻底卡死
        yield return null;
    }

    // 处理结果
    if (string.IsNullOrEmpty(www.error))
    {
        string jsonData = www.text;
        ProcessJson(jsonData);
    }
}

注意:这种方式会让当前帧的所有其他逻辑暂停,直到请求完成,只有在极端场景下才考虑使用。

额外提醒:WWW已过时,推荐使用UnityWebRequest

Unity已经标记WWW为过时API,现在更推荐使用UnityWebRequest来处理网络请求,它的用法类似,同样可以用协程等待:

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

IEnumerator FetchJsonWithUnityWebRequest(string url)
{
    using (UnityWebRequest webRequest = UnityWebRequest.Get(url))
    {
        // 发送请求并等待完成
        yield return webRequest.SendWebRequest();

        if (webRequest.result != UnityWebRequest.Result.Success)
        {
            Debug.LogError(webRequest.error);
        }
        else
        {
            string jsonData = webRequest.downloadHandler.text;
            ProcessJson(jsonData);
        }
    }
}

总结一下:永远优先用协程来处理Unity中的异步网络请求,既不会阻塞主线程,又能按顺序处理请求完成后的逻辑。直接阻塞主线程的做法几乎没有合适场景,一定要避免。

内容的提问来源于stack exchange,提问作者Quinten.GeoSolutions

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:24:53