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
相关产品推荐
相关产品推荐

