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