协同协程
协同程序可以在内部生成,并等待其他协同程序。
所以,你可以链接序列 - 一个接一个。
这非常简单,是 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());