簡體   English   中英

如何理解這個Unity協程?

[英]How to understand this Unity Coroutine?

using UnityEngine;
using System.Collections;

public class CoroutineExample : MonoBehaviour
{
    IEnumerator Start ()
    {
        print ("Starting " + Time.time);
        yield return StartCoroutine (WaitAndPrint ());
        print ("Done " + Time.time);
    }

    IEnumerator WaitAndPrint ()
    {
        yield return new WaitForSeconds (5f);
        print ("WaitAndPrint " + Time.time);
    }
}

結果是

Starting 0
WaitAndPrint 5.010554
Done 5.010554

我有兩個問題?

首先,如何理解函數Start()的返回值。 我曾經看到Start()的返回值是空的。 在我看來,Start()僅由Unity執行一次(一幀),但是收益回報似乎使Start()函數在兩幀中執行;

其次,我也對結果感到困惑。 我認為結果應該是

Starting 0
Done 5.010554
WaitAndPrint 5.010554

因為StartCoroutine()啟動函數WaitAndPrint()。 在WaitAndPrint()函數中, yield return使此函數在此幀中暫停並返回Start()。 然后Start()繼續進行,並顯示“ Done xxxxx”。 5秒后,WaitAndPrint()恢復並打印“ WaitAndPrint xxxxx”。

我哪里錯了?

這是我對這個結果的理解:

Start()函數由Unity調用一次,並顯示“已啟動”。

然后,以下代碼行做了兩件事:

yield return StartCoroutine (WaitAndPrint ());
  • 它啟動了WaitAndPrint()協程
  • 它等待結束,然后再繼續執行Start()協程。

WaitAndPrint()協程將完成其工作:

  • 等待5秒鍾
  • 打印“ WaitAndPrint” +時間

然后,Start()協程將恢復並顯示“完成” +時間。

這就是為什么

print ("WaitAndPrint" + Time.time);

在之前打印:

print ("Done " + Time.time);

另外,您應該編輯您的帖子,它在第一個結果中會丟失空格:

WaitAndPrint5.010554

應該

WaitAndPrint 5.010554

抱歉,如果不清楚,這是我第一次在StackOverflow上回答,希望對您有所幫助!

當您調用yield return ,控件將由Unity控制。

當您啟動一個Coroutine Unity將采用該方法返回的IEnumerator ,並在返回的IEnumerator上調用MoveNext

根據對象的類型和對象中的值,Unity將決定要做什么。

Start方法中, yield語句返回另一個IEnumerator因此Unity不會在第二個IEnumerator完成之前在Start返回的對象上調用MoveNext

WaitAndPrint ,第一個MoveNext返回一個WaitForSeconds對象,基於Unity決定,直到經過5秒鍾,它調用MoveNext 5秒后,它再次調用MoveNext ,然后執行該方法的其余部分,即此行

print ("WaitAndPrint" + Time.time);

作為由yield return StartCoroutine (WaitAndPrint ());IEnumerator返回yield return StartCoroutine (WaitAndPrint ()); 到達其末尾時,它將在Start返回的IEnumerator上調用MoveNext ,這將執行Start剩下的內容:

print ("Done " + Time.time);

希望這足夠清楚:)

IEnumerators是迭代器塊,它們不一定要執行1幀,當您放置yield return ,您實際上是在告訴它迭代多個幀。

在迭代器方法中到達yield return語句時,將返回expression,並保留代碼中的當前位置。

代替IEnumerators,您可以“幾乎”始終使用Invoke方法。 嘗試與那個人一起工作,您的生活會更輕松:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM