6

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");
        }
}
Rana
  • 1,675
  • 3
  • 25
  • 51
Sudhir Kotila
  • 687
  • 9
  • 20

2 Answers2

5

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.

kiloton
  • 105
  • 2
  • 10
Imapler
  • 1,401
  • 12
  • 26
  • Thnx Impler , But at a same time both co-routines are running and i want to when second co-routine is start before it first co-routine i want to stop how it can possible you have any idea? – Sudhir Kotila Aug 08 '14 at 14:26
  • Its a bit hard to understand you but i think you mean that first you have one coroutine started and when you start your second you want to stop the first, is this correct? – Imapler Aug 08 '14 at 14:36
  • Yea Absolutely your understanding is correct and because that i want to handle 4-5 co-routines at the same time so can you help me regarding my question ? – Sudhir Kotila Aug 08 '14 at 14:41
  • i dont use diffrent co-routines , i use same co-routines for all. – Sudhir Kotila Aug 08 '14 at 14:55
  • Then your only choice is to either cancel the one you are in by yield break or cancel all except the one you are in by using StopCoroutine – Imapler Aug 08 '14 at 14:59
  • 3
    Also, you can pass control flag to coroutine (wrapper class with bool member). Raise this flag from main loop and check this flag in coroutine loop and do **yield break** when flag is raised. – game development germ Aug 08 '14 at 15:07
3

@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;
    }
}
Jerry Switalski
  • 2,690
  • 1
  • 18
  • 36