unity3d 链接协程

示例

协程可以在自己内部屈服,并等待其他协程

因此,您可以链接序列-“一个接一个”。

这非常简单,并且是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());