Wie kann man auf asynchrone Operationen / Coroutinen warten?


11

Ich suche nach einer generischen / wiederverwendbaren Methode, um darauf zu warten, dass Coroutinen und asynchrone Vorgänge in Unity 5 abgeschlossen werden, ähnlich dem awaitSchlüsselwort von C # 5 .

Der einfachste Weg, den ich mir vorstellen kann, ist so etwas:

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

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

und dann in einer anderen Coroutine:

 while(!someUtilityInstance.IsDoingSomething)
     yield return null;

Dies ist jedoch nicht sehr schön, da es den Code mit whileAnweisungen überfüllt , nicht wiederverwendbar ist (benötigt Instanzen und dedizierte Klassen, auch für einfache Dienstprogrammfunktionen!) Und viele Singleton- oder statische Dinge, bei denen es nicht einmal benötigt wird.

Das nächste, was ich gefunden habe, ist die Verwendung von Unity's AsyncOperation. Das hier funktioniert sehr gut:

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

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

Das Problem ist jedoch: Wie erstelle ich eine AsyncOperation? Einige Dienste SceneManagerverwenden es beispielsweise, aber in der Dokumentation fehlt es an Informationen zum Erstellen benutzerdefinierter Vorgänge oder zum Umschließen vorhandener Coroutinen usw.

Gibt es also eine Möglichkeit, ein einfaches, generisches und wiederverwendbares "Warten" für benutzerdefinierte Coroutinen zu erstellen?


Vielleicht Reflexion und Rückrufe verwenden? Übergeben Sie zwei Methoden in eine Coroutine. Der erste die Methode zu tun. Verwenden Sie Reflexion, um zu sehen, wann es
fertig ist

Antworten:



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.