协程可以在自己内部屈服,并等待其他协程。
因此,您可以链接序列-“一个接一个”。
这非常简单,并且是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());
必须自己在协程中。也就是说,它们必须是type的函数IEnumerator。因此,在我们的示例中为IEnumerator BeginRace。因此,从“普通”代码中,您可以通过StartCoroutine调用启动该协程。
StartCoroutine(BeginRace());
为了进一步了解链接,这是一个链接协程的函数。您传入一系列协程。该函数依次运行许多协程。
// 一个接一个地运行各种例程 IEnumerator OneAfterTheOther( params IEnumerator[] routines ) { foreach ( var item in routines ) { while ( item.MoveNext() ) yield return item.Current; } yield break; }
这就是您的称呼方式……假设您具有三个功能。回想一下,它们必须全部是IEnumerator:
IEnumerator PrepareRace() { // 编码,人群欢呼和体育场周围的镜头平移 yield break; } IEnumerator Countdown() { // 代码,为您的UI倒计时动画 yield break; } IEnumerator StartRace() { // 编码,摄像头移动和灯光更改并启动AI 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());