看下面程序

    void Start()
    {
        print("Starting " + Time.time);
        StartCoroutine(WaitAndPrint(2.0F));
        print("Before WaitAndPrint Finishes " + Time.time);
    }
    IEnumerator WaitAndPrint(float waitTime)
    {
        yield return new WaitForSeconds(waitTime);
        print("WaitAndPrint " + Time.time);
    }

  程序的输出结果是:

Starting 0
Before WaitAndPrint Finishes 0
WaitAndPrint 2.00175

当给StartCoroutine方法添加修饰时,如下:

    IEnumerator Start()
    {
        print("Starting " + Time.time);
        yield return StartCoroutine(WaitAndPrint(2.0F));
        print("Done " + Time.time);
    }
    IEnumerator WaitAndPrint(float waitTime)
    {
        yield return new WaitForSeconds(waitTime);
        print("WaitAndPrint " + Time.time);
    }

  此时,输出的结果是:

Starting 0
WaitAndPrint 2.003294
DOne 2.003294

  结论:一个协同程序在执行过程中,可以在任意位置使用yield语句。yield的返回值控制何时恢复协同程序向下执行。协同程序在对象自有帧执行过程中堪称优秀。协同程序在性能上没有更多的开销。StartCoroutine函数是立刻返回的,但是yield可以延迟结果。直到协同程序执行完毕。

很多情况下,我们会用到StartCoroutine的一个变体。使用有字符串方法名的StartCoroutine允许你用StopCoroutine去停止它。其缺点就是会有较高的性能开销,而且你只能传递一个参数。

    IEnumerator Start()
    {
        StartCoroutine("DoSomething", 2.0F);
        yield return new WaitForSeconds(1);
        StopCoroutine("DoSomething");
        print("结束");
    }
    IEnumerator DoSomething(float someParameter)
    {
        while (true)
        {
            print("DoSomething Loop");
            yield return null;
        }
    }

  结果是在一秒内循环输出 DoSomething Loop,最后输出 “结束”