Reputation: 677
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
Reputation: 1422
There are three ways to stop coroutines.
StopAllCoroutines()
, which will obviously stop all running coroutines.StopCoroutine(coroutine)
, where coroutine
is a variable name given to your IEnumerator
.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
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