Завершение сопрограммы во время работы в unity3d - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь запустить и завершить сопрограмму кнопкой. Я могу запустить сопрограмму, но не могу ее остановить, если я снова нажимаю кнопку после первого запуска сопрограммы, она просто перезапускается и значение ползунка увеличивается.

вот мой код

    public void LoopButton(){

    if (lb == 1){
        StopCoroutine (AutoLoop());
        tb--;
    } else {
        StartCoroutine (AutoLoop ());
        tb++;
    }
}

IEnumerator AutoLoop(){

    slider.value = slider.minValue;

    while(slider.value < slider.maxValue){
        slider.value++;
        yield return new WaitForSeconds(0.5f);
    }

    StartCoroutine (AutoLoop());
}

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Использовать строку для имени сопрограммы. Как это:

public void LoopButton(){

    if (lb == 1){
        StopCoroutine ("AutoLoop");
        tb--;
    } else {
        StartCoroutine ("AutoLoop");
        tb++;
    }
}

IEnumerator AutoLoop(){

    slider.value = slider.minValue;

    while(slider.value < slider.maxValue){
        slider.value++;
        yield return new WaitForSeconds(0.5f);
    }

    StartCoroutine ("AutoLoop");
}
0 голосов
/ 02 мая 2018

Вам необходимо позвонить StopCoroutine со ссылкой на то же самое Coroutine, возвращаемое StartCoroutine, например:

private Coroutine loopCoroutine;

public void LoopButton()
{
    if (lb == 1)
    {
        StopCoroutine(loopCoroutine);
        tb--;
    }
    else
    {
        loopCoroutine = StartCoroutine(AutoLoop());
        tb++;
    }
}

Чтобы использовать этот подход, измените метод AutoLoop, чтобы использовать цикл while вместо запуска другой сопрограммы AutoLoop в конце метода. В противном случае вы не сможете остановить эту новую сопрограмму, запущенную в конце AutoLoop.

IEnumerator AutoLoop()
{
    while(true)
    {
        slider.value = slider.minValue;

        while (slider.value < slider.maxValue)
        {
            slider.value++;
            yield return new WaitForSeconds(0.5f);
        }
    }
}

Для альтернативного решения, как прокомментировал другой пользователь, также можно остановить сопрограмму с помощью логического флага:

private bool stopLoop;

public void LoopButton()
{
    if (lb == 1)
    {
        stopLoop = true;
        tb--;
    }
    else
    {
        stopLoop = false;
        StartCoroutine (AutoLoop ());
        tb++;
    }
}

IEnumerator AutoLoop()
{
    slider.value = slider.minValue;

    while (slider.value < slider.maxValue && !stopLoop)
    {
        slider.value++;
        yield return new WaitForSeconds(0.5f);
    }

    if (!stopLoop)
    {
        StartCoroutine(AutoLoop());
    }
}

Однако использование Unity StopCoroutine предпочтительнее, чем использование логического флага для удобства чтения и очистки.

0 голосов
/ 02 мая 2018

Вы можете использовать StopCoroutine.

Больше информации здесь: https://docs.unity3d.com/ScriptReference/MonoBehaviour.StopCoroutine.html

...