Estou procurando uma maneira genérica / reutilizável de aguardar a conclusão de operações de corotinas e assíncronas no Unity 5, semelhante à await
palavra-chave do C # 5 .
A maneira mais simples de pensar é algo como isto:
public class SomeUtility {
public bool IsDoingSomething { get; private set; }
public IEnumerator DoSomethingAsync() {
IsDoingSomething = true;
yield return new WaitForSeconds(2);
IsDoingSomething = false;
}
}
e depois em outra corotina:
while(!someUtilityInstance.IsDoingSomething)
yield return null;
No entanto, isso não é muito bom, porque confunde o código com while
instruções, não é reutilizável (precisa de instâncias e classes dedicadas, mesmo para funções utilitárias simples!) E muitas coisas singleton ou estática, onde nem é necessário.
O mais próximo que encontrei foi o uso do Unity AsyncOperation
. Isso aqui funciona muito bem:
public static IEnumerator Await(this AsyncOperation operation) {
while(!operation.isDone)
yield return operation;
}
yield return SceneManager.LoadLevelAsync("blaaaah").Await();
No entanto .. o problema é: Como criar um AsyncOperation
? Alguns serviços, por exemplo, SceneManager
estão sendo usados, mas a documentação carece completamente de algo sobre a criação de operações personalizadas ou sobreposição de corotinas existentes etc.
Então, existe uma maneira de criar um "aguardar" simples, genérico e resuable para corotinas personalizadas?
fonte
Respostas:
Esperará até que seu método seja concluído, o único inconveniente dessa solução é que o força a fazer essa chamada dentro de um
IEnumator
método.Consulte http://docs.unity3d.com/ScriptReference/Coroutine.html
fonte
Com o Unity 2017, agora você pode usar o Async Aguardar como uma alternativa às corotinas, conforme descrito aqui
fonte