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 await
palabra 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 while
declaraciones, 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 SceneManager
está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?
fuente
Respuestas:
Esperará hasta que su método se haya completado, el único inconveniente con esa solución es que lo obliga a hacer esta llamada dentro de un
IEnumator
método.Ver http://docs.unity3d.com/ScriptReference/Coroutine.html
fuente
Con Unity 2017 ahora puede usar async await como alternativa a las corutinas como se describe aquí
fuente