Saya mencari cara generik / dapat digunakan kembali untuk menunggu operasi coroutine dan asynchronous selesai di Unity 5, mirip dengan await
kata 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 while
pernyataan, 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 SceneManager
menggunakannya, 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?
sumber
Jawaban:
Akan menunggu sampai metode Anda selesai, satu-satunya ketidaknyamanan dengan solusi itu memaksa Anda untuk melakukan panggilan ini dalam suatu
IEnumator
metode.Lihat http://docs.unity3d.com/ScriptReference/Coroutine.html
sumber
Dengan Unity 2017 Anda sekarang dapat menggunakan async menunggu sebagai alternatif untuk coroutine seperti yang dijelaskan di sini
sumber