Bagaimana cara menunggu operasi / coroutine async?

11

Saya mencari cara generik / dapat digunakan kembali untuk menunggu operasi coroutine dan asynchronous selesai di Unity 5, mirip dengan awaitkata kunci C # 5 .

Cara paling sederhana yang bisa saya pikirkan adalah sesuatu seperti ini:

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

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

dan kemudian di coroutine lain:

 while(!someUtilityInstance.IsDoingSomething)
     yield return null;

Namun ini tidak terlalu bagus karena mengacaukan kode dengan whilepernyataan, tidak dapat digunakan kembali (perlu instance dan kelas khusus bahkan untuk fungsi utilitas sederhana!) Dan banyak hal tunggal atau statis di mana itu bahkan tidak diperlukan.

Yang paling dekat yang saya temukan adalah menggunakan Unity AsyncOperation. Ini di sini bekerja dengan sangat baik:

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

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

Namun .. masalahnya adalah: Bagaimana cara membuat AsyncOperation? Beberapa layanan, contohnya SceneManagermenggunakannya, tetapi dokumentasi sama sekali tidak memiliki apa-apa tentang membuat operasi kustom atau membungkus coroutine yang ada, dll.

Jadi, apakah ada cara untuk membuat "menunggu" yang sederhana, generik dan resuable untuk coroutine khusus?

artganify
sumber
Mungkin menggunakan refleksi dan panggilan balik? Masukkan dua metode ke coroutine. Metode pertama yang harus dilakukan. Gunakan refleksi untuk melihat kapan selesai, lalu panggil yang kedua
Evorlor

Jawaban:

1

Dengan Unity 2017 Anda sekarang dapat menggunakan async menunggu sebagai alternatif untuk coroutine seperti yang dijelaskan di sini

Steve Vermeulen
sumber