Sto cercando un modo generico / riutilizzabile di attendere che le coroutine e le operazioni asincrone finiscano in Unity 5, simile a C # 5 await
parola chiave .
Il modo più semplice a cui riesco a pensare è qualcosa del genere:
public class SomeUtility {
public bool IsDoingSomething { get; private set; }
public IEnumerator DoSomethingAsync() {
IsDoingSomething = true;
yield return new WaitForSeconds(2);
IsDoingSomething = false;
}
}
e poi in un altro coroutine:
while(!someUtilityInstance.IsDoingSomething)
yield return null;
Tuttavia questo non è molto bello perché ingombra il codice con while
istruzioni, non è riutilizzabile (ha bisogno di istanze e classi dedicate anche per semplici funzioni di utilità!) E molte cose singole o statiche dove non è nemmeno necessario.
Il più vicino che ho trovato sta usando Unity's AsyncOperation
. Questo qui funziona molto bene:
public static IEnumerator Await(this AsyncOperation operation) {
while(!operation.isDone)
yield return operation;
}
yield return SceneManager.LoadLevelAsync("blaaaah").Await();
Tuttavia .. il problema è: come crearne uno AsyncOperation
? Alcuni servizi, ad esempio, lo SceneManager
stanno utilizzando, ma la documentazione non ha assolutamente nulla sulla creazione di operazioni personalizzate o sul confezionamento di coroutine esistenti ecc.
Quindi, c'è un modo per creare un "aspetto" semplice, generico e resuable per le coroutine personalizzate?