寫游戲代碼,往往最終需要代碼為連續的事件.結果會像這樣:
[它可以實現將一段程序延遲執行或者將其各個部分分布在一個時間段內連續執行。]
往往使用yield語句更為方便.yield語句是一個特殊的返回類型,它確保函數從yield語句的下一行繼續執行.
你也可以傳遞時間值到yield語句,Update函數會在yield結束后執行下一語句.
你可以入棧並連接協程.
這個例子將執行Do,但是do函數之后的print指令會立刻執行.
這個例子將執行Do,並等待,直到Do完成再執行其他語句.【注:這里的等待是把線程時間交給其他任務,而不是阻塞式等待】
任何事件處理程序都可以是協同程序 。
注意你不能在Update或FixedUpdate函數內使用yield,但是你能使用 StartCoroutine 開始一個函數.
查看 YieldInstruction , WaitForSeconds , WaitForFixedUpdate , Coroutine and MonoBehaviour.StartCoroutine 可以獲得更多使用yield的信息.
yield return可以看做是一種特殊的return,會返回到父類繼續執行,但是yield return后面的類型或方法會有一個執行條件,當條件滿足時會回調包含yield的子函數,例如下面代碼
例1:
在執行yield return new WaitForSeconds(waitTime)時暫停的條件沒有滿足,故返回到start函數中繼續執行,直到滿足條件后再回調WaitAndPrint,所以輸出為:
Starting:0
Before WaiAndPrint:0
WaitAndPrint:2.12291
例2:
因為start為頂級函數,所以會阻塞在這里,直到StartCoroutine(WaitAndPrint(2.0F))執行完畢,輸出為:
starting:0
WaitAndPrint:2.00315
done:2.00315
[它可以實現將一段程序延遲執行或者將其各個部分分布在一個時間段內連續執行。]
- <span style="font-size:18px;">private int state = 0;
- void Update()
- {
- if (state == 0)
- {
- //做步驟0
- state = 1;
- return;
- }
- if (state == 1)
- {
- // 做步驟1
- state = 2;
- return;
- }
- // ...
- } </span>
往往使用yield語句更為方便.yield語句是一個特殊的返回類型,它確保函數從yield語句的下一行繼續執行.
- <span style="font-size:18px;">while(true) {
- // 做步驟0
- yield return 0;
- // 等待一幀
- // 做步驟1
- yield return 2;
- // 等待兩幀
- // ...
- } </span>
你也可以傳遞時間值到yield語句,Update函數會在yield結束后執行下一語句.
- <span style="font-size:18px;"> // do something
- yield return WaitForSeconds (5.0);
- //等待5秒
- // do something more... </span>
你可以入棧並連接協程.
這個例子將執行Do,但是do函數之后的print指令會立刻執行.
- <span style="font-size:18px;">Do ();
- Console.WriteLine("This is printed immediately");
- IEnumerator Do ()
- {
- Console.WriteLine("Do now");
- yield return new WaitForSeconds (2);
- Console.WriteLine("Do 2 seconds later");
- } </span>
這個例子將執行Do,並等待,直到Do完成再執行其他語句.【注:這里的等待是把線程時間交給其他任務,而不是阻塞式等待】
- <span style="font-size:18px;">// 啟動協程
- yield return StartCoroutine("Do");
- Console.WriteLine("Also after 2 seconds");
- Console.WriteLine ("這個print將在Do協程執行完以后顯示。");
- IEnumerator Do ()
- {
- Console.WriteLine("Do now");
- yield return new WaitForSeconds (2);
- Console.WriteLine("Do 2 seconds later");
- }
- </span>
任何事件處理程序都可以是協同程序 。
注意你不能在Update或FixedUpdate函數內使用yield,但是你能使用 StartCoroutine 開始一個函數.
查看 YieldInstruction , WaitForSeconds , WaitForFixedUpdate , Coroutine and MonoBehaviour.StartCoroutine 可以獲得更多使用yield的信息.
yield return可以看做是一種特殊的return,會返回到父類繼續執行,但是yield return后面的類型或方法會有一個執行條件,當條件滿足時會回調包含yield的子函數,例如下面代碼
例1:
- <span style="font-size:18px;">void Start () {
- print("Starting:" + Time.time);
- StartCoroutine(WaitAnPrint(2.0F));
- print("Before WaiAndPrint:" + Time.time);
- }
- IEnumerator WaitAndPrint(float waitTime)
- {
- yield return new WaitForSeconds(waitTime);
- print("WaitAndPrint:" + Time.time);
- }
- </span>
在執行yield return new WaitForSeconds(waitTime)時暫停的條件沒有滿足,故返回到start函數中繼續執行,直到滿足條件后再回調WaitAndPrint,所以輸出為:
Starting:0
Before WaiAndPrint:0
WaitAndPrint:2.12291
例2:
- <span style="font-size:18px;">IEnumerator Start()
- {
- print("starting:" + Time.time);
- yield return StartCoroutine(WaitAndPrint(2.0F));
- print("done:" + Time.time);
- }
- IEnumerator WaitAndPrint(float waitTime)
- {
- yield return new WaitForSeconds(waitTime);
- print("WaitAndPrint:" + Time.time);
- }</span>
因為start為頂級函數,所以會阻塞在這里,直到StartCoroutine(WaitAndPrint(2.0F))執行完畢,輸出為:
starting:0
WaitAndPrint:2.00315
done:2.00315
- <pre name="code" class="csharp"><pre name="code" class="csharp"><pre name="code" class="csharp"><p></p><pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>
- </pre></pre></pre>