我们使用Unity制作的WebGL游戏需要从GET响应的正文中获取数据。当前,这是使用静态类实现的,带有一个while循环阻塞以等待请求完成:
public static class NetworkController {
public MyDataClass GetData() {
UnityWebRequest webRequest = UnityWebRequest.Get(...);
webRequest.SendWebRequest();
while (!webRequest.isDone) {} // block here
// Get body of response webRequest.downloadHandler.text and
// return a MyDataClass object
}
}
这在编辑器中有效,直到后来我们使用WebGL disallows blocking the web request发现。 Unity建议使用协程来减轻这种情况,但是StartCoroutine()
仅存在于我们的静态类无法继承的MonoBehaviour
类中。
是否只有在使用静态类的同时Web请求得到响应后,才能继续执行?
根据注释,修改了代码,因此现在静态类调用MonoBehaviour
单例:
public static class NetworkController {
public MyDataClass GetData() {
return NetworkControllerHelper.GetInstance().GetData();
}
}
public class NetworkControllerHelper : MonoBehaviour {
/* ... GetInstance() method for creating a GameObject and create & return an instance... */
private MyDataClass coroutineResult = null;
public MyDataClass GetData() {
UnityWebRequest webRequest = UnityWebRequest.Get(...);
StartCoroutine(WebRequestCoroutine(webRequest));
// How do I detect that the coroutine has ended then continue without hanging the program?
while (coroutineResult == null) {}
return coroutineResult;
}
// Coroutine for trying to get a MyDataClass object
private IEnumerator WebRequestCoroutine(UnityWebRequest webRequest) {
yield return webRequest.SendWebRequest();
while (!webRequest.isDone) yield return new WaitForSeconds(0.1f);
// Creating the MyDataClassObject
coroutineResult = ...;
yield break;
}
}
我们需要等待生成的MyDataClass创建,因此我们检查coroutineResult
是否为null
,但是使用while循环阻止挂起程序。如何在检查循环条件之前等待几秒钟?
答案 0 :(得分:0)
您无法按照here中的说明在WebGL中同步加载资源。
请勿阻止WWW或WebRequest下载
请勿使用阻止WWW或WebRequest下载的代码,例如:
while(!www.isDone) {}
尽管我找不到合适的解决方案,但我需要'webRequest.downloadHandler.text',并且希望在其他类上全局使用此字符串。