Ich suche nach einer generischen / wiederverwendbaren Methode, um darauf zu warten, dass Coroutinen und asynchrone Vorgänge in Unity 5 abgeschlossen werden, ähnlich dem await
Schlü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 while
Anweisungen ü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 SceneManager
verwenden 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?
quelle
Antworten:
Wartet, bis Ihre Methode abgeschlossen ist. Der einzige Nachteil dieser Lösung besteht darin, dass Sie gezwungen sind, diesen Aufruf innerhalb einer
IEnumator
Methode durchzuführen.Siehe http://docs.unity3d.com/ScriptReference/Coroutine.html
quelle
Mit Unity 2017 können Sie jetzt async await als Alternative zu den hier beschriebenen Coroutinen verwenden
quelle