協同協程
協同程式可以在內部生成,並等待其他協同程式。
所以,你可以連結序列 - 一個接一個。
這非常簡單,是 Unity 中的基本核心技術。
在遊戲中,某些事情必須按順序發生,這是絕對自然的。幾乎遊戲的每一輪開始都會在一段時間內以某種順序發生一系列事件。以下是你開始賽車遊戲的方式:
IEnumerator BeginRace()
{
yield return StartCoroutine(PrepareRace());
yield return StartCoroutine(Countdown());
yield return StartCoroutine(StartRace());
}
那麼,當你呼叫 BeginRace 時……
StartCoroutine(BeginRace());
它將執行你的準備匹配例行程式。 (也許,閃爍一些燈光並執行一些人群噪音,重置分數等等。)完成後,它將執行你的倒計時序列,你可以在其中設定 UI 的倒計時動畫。完成後,它將執行你的匹配開始程式碼,你可能會執行聲音效果,啟動一些 AI 驅動程式,以某種方式移動相機,等等。
為清楚起見,瞭解這三個呼叫
yield return StartCoroutine(PrepareRace());
yield return StartCoroutine(Countdown());
yield return StartCoroutine(StartRace());
必須自己在協同中。也就是說,它們必須具有 IEnumerator
型別的功能。所以在我們的例子中,這是 IEnumerator BeginRace
。因此,從普通程式碼中,你可以使用 StartCoroutine
呼叫啟動該協程。
StartCoroutine(BeginRace());
為了進一步理解連結,這裡有一個連結協同程式的功能。你傳遞了一系列協程。該函式按順序執行儘可能多的協同程式,依次排列。
// run various routines, one after the other
IEnumerator OneAfterTheOther( params IEnumerator[] routines )
{
foreach ( var item in routines )
{
while ( item.MoveNext() ) yield return item.Current;
}
yield break;
}
這就是你怎麼稱呼它…讓我們說你有三個功能。回想一下,他們都必須是 IEnumerator
:
IEnumerator PrepareRace()
{
// codesay, crowd cheering and camera pan around the stadium
yield break;
}
IEnumerator Countdown()
{
// codesay, animate your countdown on UI
yield break;
}
IEnumerator StartRace()
{
// codesay, camera moves and light changes and launch the AIs
yield break;
}
你會這樣稱呼它
StartCoroutine( MultipleRoutines( PrepareRace(), Countdown(), StartRace() ) );
或者也許是這樣的
IEnumerator[] routines = new IEnumerator[] {
PrepareRace(),
Countdown(),
StartRace() };
StartCoroutine( MultipleRoutines( routines ) );
重複一遍,遊戲中最基本的要求之一就是某些事情會隨著時間的推移一個接一個地發生。你可以非常簡單地在 Unity 中實現這一目標
yield return StartCoroutine(PrepareRace());
yield return StartCoroutine(Countdown());
yield return StartCoroutine(StartRace());