Come attendere operazioni asincrone / coroutine?


11

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 SceneManagerstanno 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?


Forse usi la riflessione e le richiamate? Passa due metodi in un coroutine. Il primo è il metodo da fare. Usa la riflessione per vedere quando finisce, quindi chiama il secondo
Evorlor

Risposte:



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.