为了账号安全,请及时绑定邮箱和手机立即绑定

在unity3d中运行时结束协程

在unity3d中运行时结束协程

C#
达令说 2021-05-17 17:18:28
我试图用按钮启动和结束协程。我可以启动协程,但无法停止,如果在第一次启动协程后再次单击该按钮,它将再次重新启动并且滑块值会上升。这是我的代码    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 回答

?
慕仙森

TA贡献1827条经验 获得超8个赞

您需要使用调用由所返回StopCoroutine的相同 引用来进行调用,如下所示:CoroutineStartCoroutine


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

    }

}

但是,StopCoroutine为了提高可读性和整洁度,使用Unity优于使用布尔值标志。


查看完整回答
反对 回复 2021-05-23
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

使用字符串作为协程名称。像这样:


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

}


查看完整回答
反对 回复 2021-05-23
?
www说

TA贡献1775条经验 获得超8个赞

您可以使用StopCoroutine

此处的更多信息:https : //docs.unity3d.com/ScriptReference/MonoBehaviour.StopCoroutine.html


查看完整回答
反对 回复 2021-05-23
  • 3 回答
  • 0 关注
  • 502 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信