簡體   English   中英

在unity3d中運行時結束協程

[英]Ending a coroutine while running in unity3d

我試圖用按鈕啟動和結束協程。 我可以啟動協程,但是無法停止,如果在第一次啟動協程后再次單擊該按鈕,它將再次重新啟動,並且滑塊值會上升。

這是我的代碼

    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());
}

你需要調用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優於使用boolean標志來提高可讀性和整潔度。

您可以使用StopCoroutine

此處提供更多信息: https : //docs.unity3d.com/ScriptReference/MonoBehaviour.StopCoroutine.html

使用字符串作為協程名稱。 像這樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM