C#:如何停止循环

C#:如何停止循环,c#,unity3d,C#,Unity3d,我想了解coroutine的概念,我不知道为什么代码在print 1,2,3时停止。但是在这个代码循环中,应该运行30次,并打印值1到30 public class NewCore : MonoBehaviour { void Start () { StartCoroutine (MyCoroutine (0.52f)); StartCoroutine (CoroutineKiller (2f)); } IEnumerator M

我想了解
coroutine
的概念,我不知道为什么代码在
print 1,2,3
时停止。但是在这个代码循环中,应该运行30次,并打印值1到30

public class NewCore : MonoBehaviour
{
    void Start ()
    {
        StartCoroutine (MyCoroutine (0.52f));
        StartCoroutine (CoroutineKiller (2f));
    }

    IEnumerator MyCoroutine (float delay)
    {
        int value = 0;
        while (value < 30)
        {
            yield return new WaitForSeconds (delay);//wait
            value ++;
            print (value);
        }

        StartCoroutine (MyCoroutine (delay));
    }

    IEnumerator CoroutineKiller (float delay)
    {
        yield return new WaitForSeconds (delay);
        StopAllCoroutines ();
    }
}
公共类NewCore:monobhavior
{
无效开始()
{
startcootine(MyCoroutine(0.52f));
启动例行程序(CoroutineKiller(2f));
}
IEnumerator例程(浮点延迟)
{
int值=0;
while(值<30)
{
返回新的WaitForSeconds(延迟);//等待
值++;
印刷品(价值);
}
start例程(MyCoroutine(delay));
}
IEnumerator协程器(浮动延迟)
{
产生返回新WaitForSeconds(延迟);
stopallcorroutines();
}
}

您正在打印1-30之间的值,延迟为0.52秒,但2秒后您停止打印(您调用
stopallcorroutines
)。这就是为什么你只看到1,2和3打印出来

尝试注释掉
start例程(CoroutineKiller(2f)),或者给它更多的延迟,看看它是如何控制流量停止的


协同例程与线程类似——虽然不是真的——但从调用
start例程
不会阻塞代码的意义上说是的

所以当你这样做的时候:

void Start ()
{
    StartCoroutine (MyCoroutine (0.52f));
    StartCoroutine (CoroutineKiller (2f));
}
它实际上会启动这两个协程,并在每次更新调用中一步一步地并排执行它们

如果希望逐个执行协同路由,请尝试以下操作:

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

IEnumerator F()
{
    // by yielding the Coroutine, it will block the execution of
    // this coroutine (F) until MyCoroutine finishes
    yield return StartCoroutine(MyCoroutine(1.52f));

    // This is no longer doing much, really.
    yield return StartCoroutine(Killer(2f));

    print("done");
}

您可以阅读有关的更多信息,其中还包括有关协同程序以及收益系统实际工作方式的信息。

您似乎正在使用StopCoroutine(MyCoroutine());在CoroutineKiller中,它在2秒后停止CoroutineKiller。(您的参数是2f,我想您使用它的时间是WaitForSeconds)。因此,您的MyCoroutine函数只工作3个延迟(0.52+0.52+0.52=1.56),在第四个延迟结束之前,您停止此协同例程,只打印1,2,3。

但是在开始时()方法
startcroutine(MyCoroutine(0.52f)
执行将首先运行第二个方法
startcroutine(CoroutineKiller(2f))
将运行。它如何在2秒时自动停止该例程happen@cenkisabi我不知道代码怎么知道当2秒完成时停止
coroutine
它跳转到该方法
startcroutine(CoroutineKiller(2f))
您的意思是返回运行等待下一次执行和
startcroutine()
run parallelstart例程将以“parallel”方式运行,但您可以生成它以等待它。但是您不能在
Start
Update
中生成它,好吗