结束协同程序

通常,当符合某些目标时,你会设计协同程序以自然结束。

IEnumerator TickFiveSeconds()
{
    var wait = new WaitForSeconds(1f);
    int counter = 1;
    while(counter < 5)
    {
        Debug.Log("Tick");
        counter++;
        yield return wait;
    }
    Debug.Log("I am done ticking");
}

为了从协同程序的内部停止协同程序,你不能简单地返回,因为你将从普通函数中提前离开。相反,你使用 yield break

IEnumerator ShowExplosions()
{
    ... show basic explosions
    if(player.xp < 100) yield break;
    ... show fancy explosions
}

你还可以强制脚本启动的所有协同程序在完成之前停止。

void OnDisable()
{
    // Stops all running coroutines
    StopAllCoroutines();
}

从调用者停止特定协程的方法取决于你启动它的方式。

如果你通过字符串名称启动了一个协同程序:

StartCoroutine("YourAnimation");

那么你可以通过使用相同的字符串名称调用 StopCoroutine 来阻止它 :

StopCoroutine("YourAnimation");

或者,你可以保持一个参考或者由协同程序方法,返回的 IEnumerator 通过 StartCoroutine 返回的 Coroutine 对象,并调用 StopCoroutine 在任的那些:

public class SomeComponent : MonoBehaviour 
{
    Coroutine routine;

    void Start () {
        routine = StartCoroutine(YourAnimation());
    }

    void Update () {
        // later, in response to some input...
        StopCoroutine(routine);
    }

    IEnumerator YourAnimation () { /* ... */ }
}