使用UnityWebRequest获取静态类中的响应主体

时间:2019-04-26 06:04:41

标签: unity3d network-programming

我们使用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循环阻止挂起程序。如何在检查循环条件之前等待几秒钟?

1 个答案:

答案 0 :(得分:0)

您无法按照here中的说明在WebGL中同步加载资源。

请勿阻止WWW或WebRequest下载

请勿使用阻止WWW或WebRequest下载的代码,例如:

while(!www.isDone) {}

尽管我找不到合适的解决方案,但我需要'webRequest.downloadHandler.text',并且希望在其他类上全局使用此字符串。