Как прекратить совместную рутину?


Когда выполняются две копрограммы, как остановить первую копрограмму?

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");
        }
}
2 4

2 ответа:

@Imapler Ответ-Это почти все, что вам нужно. Я бы только добавил, что метод StopCoroutine MonoBehaviour перегружен и имеет 3 типа параметров, поэтому можно остановить множество одноименных сорутинов. Для вашей потребности здесь, просто используйте yield break; вот так:

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

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

Существует три способа, чтобы остановить сопрограммы. Во-первых, это вызов StopAllCoroutines. Второй-вызвать StopCoroutine. И третье - сделать йилд-брейк изнутри корутины.

StopAllCoroutines остановить все сопрограммы, StopCoroutine остановить все сопрограммы с указанием наименования и выхода перерыва остановок, что сопрограмма. Стоит отметить, что и StopAllCoroutines, и StopCoroutine могут остановить корутин только тогда, когда корутин достигает доходности.

Так что если у вас две сопрограммы с тем же именем, и вы хотите, чтобы остановить тот, который вы выполняете в вас сделать yeild перерыв. Интересно, что если вы хотите остановить любую другую сопрограмму, кроме той, которую вы выполняете, вы вызываете StopCoroutine из этой сопрограммы.