Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在unity3d中运行时结束协同程序_C#_Loops_Unity3d_Coroutine - Fatal编程技术网

C# 在unity3d中运行时结束协同程序

C# 在unity3d中运行时结束协同程序,c#,loops,unity3d,coroutine,C#,Loops,Unity3d,Coroutine,我试着用一个按钮开始和结束一个协同程序。我可以启动协同程序,但我无法停止它,如果我在第一次启动协同程序后再次单击按钮,它将再次重新启动,滑块值将上升 这是我的密码 public void LoopButton(){ if (lb == 1){ StopCoroutine (AutoLoop()); tb--; } else { StartCoroutine (AutoLoop ()); tb++;

我试着用一个按钮开始和结束一个协同程序。我可以启动协同程序,但我无法停止它,如果我在第一次启动协同程序后再次单击按钮,它将再次重新启动,滑块值将上升

这是我的密码

    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());
}
public void LoopButton(){
如果(lb==1){
StopCoroutine(autolop());
结核--;
}否则{
start例程(autolop());
tb++;
}
}
IEnumerator autolop(){
slider.value=slider.minValue;
while(slider.value
您可以使用
StopCoroutine

更多信息请点击此处:

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

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");
}
public void LoopButton(){
如果(lb==1){
StopCorroutine(“AutoLop”);
结核--;
}否则{
启动例行程序(“自动运行”);
tb++;
}
}
IEnumerator autolop(){
slider.value=slider.minValue;
while(slider.value
您需要调用
StopCorroutine
,并引用
StartRoutine
返回的相同的
Corroutine
,如下所示:

private Coroutine loopCoroutine;

public void LoopButton()
{
    if (lb == 1)
    {
        StopCoroutine(loopCoroutine);
        tb--;
    }
    else
    {
        loopCoroutine = StartCoroutine(AutoLoop());
        tb++;
    }
}
要使用此方法,请将
autolop
方法更改为使用while循环,而不是在方法末尾启动另一个
autolop
corroutine。否则,您将无法停止在
autolop
结束时启动的新协同程序

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

        while (slider.value < slider.maxValue)
        {
            slider.value++;
            yield return new WaitForSeconds(0.5f);
        }
    }
}
IEnumerator autolop()
{
while(true)
{
slider.value=slider.minValue;
while(slider.value

对于另一个解决方案,正如另一个用户所评论的,也可以通过布尔标志停止协同路由:

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());
    }
}
private bool stopLoop;
公共无效循环按钮()
{
如果(lb==1)
{
stopLoop=true;
结核--;
}
其他的
{
stopLoop=false;
start例程(autolop());
tb++;
}
}
IEnumerator autolop()
{
slider.value=slider.minValue;
while(slider.value

但是,使用Unity的StopCorroutine比使用布尔标志更适合于可读性和清洁性。

您应该添加一个“取消”布尔值,您可以在whiles条件下进行检查。没有一个专门的方法来统一处理这个问题。“看起来这里确实发生了一些隐含的多重任务。”克里斯托弗同意。请注意,通过协同程序进行多任务处理只是一个奇特的调度程序,它在Unity中的同一个主线程中运行:)@Christopher Awesome,谢谢大家!:)@克里斯托弗可能会补充这一点作为答案。我会投你的票:)我认为有一种特定于团结的方式来处理这个问题,所以我添加了一个答案@Christopher我也在我的帖子中加入了你的建议作为备选答案。我的理解是,使用布尔标志允许协同程序执行它可能需要的任何类型的清理,例如,如果需要关闭文件访问。@浸入式:这种清理应该留给finally块,不管是哪种方式。finallies甚至应该在“ThreadAborted”异常上运行。这一方面的破坏,他们应该始终运行。这里有两篇我经常链接的文章:|@Christopher我原则上同意,但在Unity中做有点困难,特别是对于Unity协程,因为它们在主线程上运行,而不是在新线程上运行(即没有
ThreadAbortedException
)。我对这个问题不太熟悉,但我认为在使用Test/Copy/Time> Trace> TraceOutin 时,有一些问题需要考虑。例如,看@sonny:哦,我只担心他们会做那么愚蠢的事。让编译器为您执行多任务协同处理的核心思想是,它不会做那么愚蠢的事情。看起来“StopAndDispose()”扩展方法就是处理这种情况的方法。