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?