จะรอการดำเนินการ async / coroutines ได้อย่างไร


11

ฉันกำลังมองหาวิธีทั่วไป / นำมาใช้ซ้ำเพื่อรอ coroutines และการดำเนินการแบบอะซิงโครนัสให้เสร็จใน Unity 5 คล้ายกับawaitคำสำคัญของ C # 5

วิธีที่ง่ายที่สุดที่ฉันนึกได้ก็คือ:

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

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

และจากนั้นใน coroutine อื่น:

 while(!someUtilityInstance.IsDoingSomething)
     yield return null;

อย่างไรก็ตามมันไม่ได้ดีมากเพราะมันจะตัดโค้ดที่มีwhileคำสั่งไม่สามารถใช้ซ้ำได้ (ต้องการอินสแตนซ์และคลาสเฉพาะแม้กระทั่งสำหรับฟังก์ชั่นยูทิลิตี้ง่าย ๆ !) และหลาย ๆ อย่างของ singleton หรือ static

AsyncOperationผมพบว่าใกล้เคียงที่สุดคือการใช้ความสามัคคีของ นี่มันใช้งานได้ดีมาก:

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

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

อย่างไรก็ตาม .. ปัญหาคือ: วิธีการสร้างAsyncOperation? ตัวอย่างเช่นการSceneManagerใช้บริการบางอย่าง แต่เอกสารประกอบไม่มีอะไรสมบูรณ์เกี่ยวกับการสร้างการดำเนินการที่กำหนดเองหรือการตัด coroutines ที่มีอยู่เป็นต้น

ดังนั้นมีวิธีในการสร้าง "รอคอย" ง่าย ๆ ทั่วไปและ resuable สำหรับ coroutines ที่กำหนดเองหรือไม่?


บางทีใช้การสะท้อนและการโทรกลับ ผ่านสองวิธีลงใน coroutines วิธีแรกที่ต้องทำ ใช้การไตร่ตรองเพื่อดูว่ามันเสร็จสิ้นเมื่อใดแล้วจึงเรียกอันที่สอง
Evorlor

คำตอบ:


2
yield return StartCoroutine(yourIEnumatorMethod());

จะรอจนกว่าวิธีการของคุณเสร็จสมบูรณ์สิ่งเดียวที่ไม่สะดวกกับโซลูชันนั้นคือมันบังคับให้คุณทำการโทรนี้ภายในIEnumatorวิธีการ

ดูhttp://docs.unity3d.com/ScriptReference/Coroutine.html


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.