Использование UnityWebRequest для получения тела ответа в статическом классе - PullRequest
0 голосов
/ 26 апреля 2019

Наша игра WebGL, созданная с использованием Unity, требует получения данных из тела ответа 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 запрещает блокировку веб-запроса . Unity предлагает использовать сопрограммы для смягчения этого, но StartCoroutine() существует только в классе MonoBehaviour, от которого наш статический класс не может наследовать.

Есть ли способ продолжить выполнение только после того, как веб-запрос получит ответ при использовании статического класса?


Согласно комментариям, код модифицируется, поэтому теперь статический класс вызывает MonoBehaviour singleton:

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 для блокировки приводит к зависанию программы. Как мне подождать несколько секунд, прежде чем проверять состояние цикла?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...