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?

artganifizieren
quelle
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:

2
yield return StartCoroutine(yourIEnumatorMethod());

Wartet, bis Ihre Methode abgeschlossen ist. Der einzige Nachteil dieser Lösung besteht darin, dass Sie gezwungen sind, diesen Aufruf innerhalb einer IEnumatorMethode durchzuführen.

Siehe http://docs.unity3d.com/ScriptReference/Coroutine.html

Thomas LAURENT
quelle
1

Mit Unity 2017 können Sie jetzt async await als Alternative zu den hier beschriebenen Coroutinen verwenden

Steve Vermeulen
quelle