Szukam ogólnego / wielokrotnego użytku sposobu oczekiwania na zakończenie operacji asynchronicznych w Unity 5, podobnie jak w przypadku await
słowa kluczowego C # 5 .
Najprostszym sposobem, w jaki mogę myśleć, jest coś takiego:
public class SomeUtility {
public bool IsDoingSomething { get; private set; }
public IEnumerator DoSomethingAsync() {
IsDoingSomething = true;
yield return new WaitForSeconds(2);
IsDoingSomething = false;
}
}
a następnie w innej coroutine:
while(!someUtilityInstance.IsDoingSomething)
yield return null;
Nie jest to jednak bardzo miłe, ponieważ zaśmieca kod while
instrukcjami, nie nadaje się do ponownego użycia (potrzebuje instancji i dedykowanych klas nawet dla prostych funkcji narzędziowych!) I wielu singletonów lub statycznych rzeczy, w których nawet nie jest to potrzebne.
Najbliższe, jakie znalazłem, to używanie Unity's AsyncOperation
. To działa bardzo ładnie:
public static IEnumerator Await(this AsyncOperation operation) {
while(!operation.isDone)
yield return operation;
}
yield return SceneManager.LoadLevelAsync("blaaaah").Await();
Jednak .. problemem jest: Jak utworzyć AsyncOperation
? Na przykład SceneManager
korzysta z niego kilka usług, ale w dokumentacji całkowicie brakuje niczego w tworzeniu niestandardowych operacji lub pakowaniu istniejących korporacji itp.
Czy jest więc sposób na stworzenie prostego, ogólnego i możliwego do zastąpienia „czekania” na niestandardowe coroutines?
źródło
Odpowiedzi:
Poczeka, aż twoja metoda się zakończy, jedyne niewygodne z tym rozwiązaniem jest to, że zmusza cię do wykonania tego wywołania w ramach
IEnumator
metodyZobacz http://docs.unity3d.com/ScriptReference/Coroutine.html
źródło
Dzięki Unity 2017 możesz teraz używać asynchronicznego oczekiwania jako alternatywy dla coroutines, jak opisano tutaj
źródło