Tôi đang tìm kiếm một cách chung / có thể sử dụng lại để chờ coroutines và các hoạt động không đồng bộ kết thúc trong Unity 5, tương tự như await
từ khóa của C # 5 .
Cách đơn giản nhất tôi có thể nghĩ là một cái gì đó như thế này:
public class SomeUtility {
public bool IsDoingSomething { get; private set; }
public IEnumerator DoSomethingAsync() {
IsDoingSomething = true;
yield return new WaitForSeconds(2);
IsDoingSomething = false;
}
}
và sau đó trong một coroutine khác:
while(!someUtilityInstance.IsDoingSomething)
yield return null;
Tuy nhiên, điều này không hay lắm vì nó mã hóa các while
câu lệnh, không thể sử dụng lại được (cần các thể hiện và các lớp chuyên dụng ngay cả đối với các hàm tiện ích đơn giản!) Và rất nhiều công cụ đơn lẻ hoặc tĩnh mà thậm chí không cần thiết.
Gần nhất tôi tìm thấy là sử dụng Unity's AsyncOperation
. Điều này ở đây hoạt động rất độc đáo:
public static IEnumerator Await(this AsyncOperation operation) {
while(!operation.isDone)
yield return operation;
}
yield return SceneManager.LoadLevelAsync("blaaaah").Await();
Tuy nhiên .. vấn đề là: Làm thế nào để tạo ra một AsyncOperation
? Một vài dịch vụ, ví dụ như SceneManager
đang sử dụng nó, nhưng tài liệu hoàn toàn không có bất cứ điều gì về việc tạo các hoạt động tùy chỉnh hoặc gói các coroutines hiện có, v.v.
Vì vậy, có cách nào để tạo ra một "sự chờ đợi" đơn giản, chung chung và có thể giải quyết được cho các coroutines tùy chỉnh không?