Я ищу универсальный / повторно используемый способ ожидания завершения сопрограмм и асинхронных операций в Unity 5, аналогично await
ключевому слову C # 5 .
Самый простой способ, который я могу придумать, это что-то вроде этого:
public class SomeUtility {
public bool IsDoingSomething { get; private set; }
public IEnumerator DoSomethingAsync() {
IsDoingSomething = true;
yield return new WaitForSeconds(2);
IsDoingSomething = false;
}
}
а потом в другом сопрограмме
while(!someUtilityInstance.IsDoingSomething)
yield return null;
Однако это не очень хорошо, потому что это загромождает код с while
операторами, не может использоваться повторно (нужны экземпляры и выделенные классы даже для простых служебных функций!) И много одиночных или статических вещей, где это даже не нужно.
Самое близкое, что я нашел, это использование Unity AsyncOperation
. Это здесь работает очень хорошо:
public static IEnumerator Await(this AsyncOperation operation) {
while(!operation.isDone)
yield return operation;
}
yield return SceneManager.LoadLevelAsync("blaaaah").Await();
Однако проблема заключается в следующем: как создать AsyncOperation
? Некоторые сервисы, например SceneManager
, используют его, но в документации совершенно ничего не говорится о создании пользовательских операций, обертке существующих сопрограмм и т. Д.
Итак, есть ли способ создать простое, универсальное и пригодное для повторения «ожидание» для пользовательских сопрограмм?
источник
Ответы:
Будет ждать, пока ваш метод не завершится, единственное неудобство с этим решением - оно заставляет вас делать этот вызов внутри
IEnumator
метода.См. Http://docs.unity3d.com/ScriptReference/Coroutine.html.
источник
С Unity 2017 вы теперь можете использовать async await в качестве альтернативы сопрограммам, как описано здесь
источник