¿Cómo esperar operaciones asincrónicas / corutinas?

11

Estoy buscando una forma genérica / reutilizable de esperar a que finalicen las rutinas y las operaciones asincrónicas en Unity 5, similar a la awaitpalabra clave de C # 5 .

La forma más simple que se me ocurre es algo como esto:

 public class SomeUtility {
     public bool IsDoingSomething { get; private set; }

     public IEnumerator DoSomethingAsync() {
         IsDoingSomething = true;
         yield return new WaitForSeconds(2);
         IsDoingSomething = false;
     }
 }

y luego en otra corutina:

 while(!someUtilityInstance.IsDoingSomething)
     yield return null;

Sin embargo, esto no es muy bueno porque satura el código con whiledeclaraciones, no es reutilizable (¡necesita instancias y clases dedicadas incluso para funciones de utilidad simples!) Y muchas cosas simples o estáticas donde ni siquiera es necesario.

Lo más cercano que encontré es usar Unity's AsyncOperation. Esto aquí funciona muy bien:

public static IEnumerator Await(this AsyncOperation operation) {
    while(!operation.isDone)
        yield return operation;
}

yield return SceneManager.LoadLevelAsync("blaaaah").Await();

Sin embargo ... el problema es: ¿Cómo crear un AsyncOperation? Algunos servicios, por ejemplo, lo SceneManagerestán utilizando, pero la documentación carece por completo de crear operaciones personalizadas o envolver corutinas existentes, etc.

Entonces, ¿hay alguna manera de crear una "espera" simple, genérica y valiosa para las corutinas personalizadas?

artganify
fuente
¿Quizás usar reflexión y devoluciones de llamada? Pase dos métodos en un coroutines. El primero el método para hacer. Use la reflexión para ver cuándo termina, luego llame al segundo
Evorlor

Respuestas:

1

Con Unity 2017 ahora puede usar async await como alternativa a las corutinas como se describe aquí

Steve Vermeulen
fuente