Ожидая завершения запроса UnityWebRequest
со свойством async.isDone
, вы должны выходить из этого цикла while
.Ваш текущий код может вызвать бесконечный цикл на устройствах Android или сбой загрузки.В документации, на которую вы ссылаетесь, написано, что вы можете использовать while (!async.isDone)
, но вы должны ее получить.Это относится ко всем платформам, а не только к WebGL.
Заменить
while (!async.isDone) { }
на
while (!async.isDone) { yield return null; }
Это заставит цикл while
выполнять каждый кадр и проверять, async.isDone
имеет значение true вместо блокировки всей программы.
Примечание:
При втором редактировании вы также хотите получить доступ к загруженным данным вне функции.Например, вы хотите сделать это:
StartCoroutine(functionname());
//then use the downloaded data
Debug.Log(downloaded_data);
У вас есть два способа сделать это:
1 .Получите функцию coorutine, как я делал выше, но с yield return StartCoroutine(functionname())
.Это должно быть сделано из другой функции сопрограммы:
Функция запроса:
string v_UserToken;
IEnumerator m_GetUserToken(string url)
{
UnityWebRequest request = UnityWebRequest.Get(url);
UnityWebRequestAsyncOperation async = request.SendWebRequest();
while (!async.isDone) { yield return null; }
if (request.isNetworkError || request.isHttpError)
{
v_UserToken = request.error;
}
else
{
v_UserToken = request.downloadHandler.text;
}
}
Затем дождитесь его завершения после вызова:
IEnumerator AnotherCoroutineFunc()
{
//Call and wait for the m_GetUserToken coroutine to finish
yield return StartCoroutine(m_GetUserToken("YourURL"));
//You can now use the v_UserToken variable
Debug.Log(v_UserToken);
}
2 . Вы можете использовать Action
, чтобы дождаться его.
Функция запроса с Action
:
IEnumerator m_GetUserToken(string url, Action<string> result)
{
UnityWebRequest request = UnityWebRequest.Get(url);
UnityWebRequestAsyncOperation async = request.SendWebRequest();
while (!async.isDone) { yield return null; }
if (request.isNetworkError || request.isHttpError)
{
Debug.Log(request.error);
if (result != null)
result(request.error);
}
else
{
Debug.Log(request.downloadHandler.data);
if (result != null)
result(request.downloadHandler.text);
}
}
Вы можете использовать лямбду для возврата результата:
void NonCoroutineFunction()
{
StartCoroutine(m_GetUserToken("YourURL", (v_UserToken) =>
{
//You can now use the v_UserToken variable
Debug.Log(v_UserToken);
}));
}