Sudhir Kotila
Sudhir Kotila

Reputation: 677

How to stop co-routine?

When two co-routines are running, how do you stop the first co-routine?

GLOBALS.stableTime = 5;

IEnumerator StableWaittingTime ()
{
        yield return new WaitForSeconds (1f);
        if (GLOBALS.stableTime == 0) {
                GameManager.instance.LevelFaildMethod ();
        } else {
                GameManager.instance.stableWaittingTime.text = GLOBALS.stableTime.ToString ();
                GLOBALS.stableTime--;
                StartCoroutine ("StableWaittingTime");
        }
}

Upvotes: 6

Views: 6084

Answers (2)

Imapler
Imapler

Reputation: 1422

There are three ways to stop coroutines.

  1. The first is to call StopAllCoroutines(), which will obviously stop all running coroutines.
  2. The second is to call StopCoroutine(coroutine), where coroutine is a variable name given to your IEnumerator.
  3. And the third is to do a yield break from within the coroutine.

Worth noting is that both StopAllCoroutines and StopCoroutine can only stop a coroutine when the coroutine reaches a yield return *.

So if you have two coroutines with the same name and you want to stop the one you are executing in you do yield break. Interestingly, if you want to stop every other coroutine besides the one you are executing in, you call StopCoroutines() from within that coroutine.

Upvotes: 5

Jerry Switalski
Jerry Switalski

Reputation: 2720

@Imapler answer is almost all you need. I would just add that StopCoroutine method of MonoBehaviour is overloaded and has 3 types of parameters, so it is possible to stop many coroutines of same name. For your need here, just use yield break; like this:

void Start () 
{
    StartCoroutine (StableWaittingTime ());
}

IEnumerator StableWaittingTime ()
{
    yield return new WaitForSeconds (1f);
    if (false) 
    {
        // do something
    } 
    else 
    {
        // do something
        StartCoroutine (StableWaittingTime ());
        yield break;
    }
}

Upvotes: 3

Related Questions