coroutine为何停止工作/执行

时间:2017-04-02 16:14:08

标签: c# unity3d timer countdown coroutine

我有一个3秒倒数计时器,当游戏未启用时会激活。 几天前我让它正常工作但现在它不再起作用了。它在数字3上被阻止。这是代码:

IEnumerator Timer() {

    Time.timeScale = 0;

    objectWithGSScript.scoreText.fontSize = 300;

    objectWithGSScript.scoreText.text = "" + 3;
    yield return WaitOneSecond();

    objectWithGSScript.scoreText.text = "" + 2;
    yield return WaitOneSecond();

    objectWithGSScript.scoreText.text = "" + 1;
    yield return WaitOneSecond();

    objectWithGSScript.scoreText.text = "Go!";
    yield return WaitOneSecond();

    Time.timeScale = 1f;

    objectWithGSScript.scoreText.text = objectWithGSScript.score.ToString();

}

IEnumerator WaitOneSecond() {
    float start = Time.realtimeSinceStartup;
    while (Time.realtimeSinceStartup < start + 1f) {
        print("entered");
        yield return null;
    }
}

它只打印一次“输入”,它似乎从协程退出,就像它永远返回null一样。

可能是什么问题?

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

代码中的函数非常好。不,它不会也不应该停在3号。

这就是为什么它表现得像是停在3号的原因。

1 。您正在呼叫Assertion Failed: A helper named "tasks/new" could not be found StopCoroutine。请检查您是否没有停止协同程序。如果你正在运行它,那么它将以这种方式运行。

2 。您正在销毁此脚本附加到的脚本或GameObject。检查您拨打StopAllCoroutinesDestroy(gameObject);或类似内容的位置。如果脚本被销毁,协程应该停止运行。

请记住,您可以从其他脚本中销毁脚本,以便检查所有脚本。

3 。您已禁用其脚本附加到的GameObject。当您禁用GameObject时,协程停止工作。检查您是否没有Destroy(this);gameObject.SetActive(false);禁用该游戏对象的任何内容。

4 。如果你在 ScriptA 中有一个协同程序功能,然后从 ScriptB 启动该协同程序,如果你销毁 ScriptB < / em>,来自 ScriptA 的协程将在yield return语句中冻结。重要的是你知道这一点。

<强> 5 即可。空问题......

也许SetActive(false);不是objectWithGSScript.scoreText.text。您必须检查每个变量,并确保它们不是nullnull stametement很好,但这是一个很好的捷径:

if

然后你可以这样做:

UnityEngine.Debug.Log(objectWithGSScript);
UnityEngine.Debug.Log(objectWithGSScript.scoreText);
UnityEngine.Debug.Log(objectWithGSScript.scoreText.text);

我想不出为什么会发生这种情况的其他可能原因,但要检查上面提到的所有这五件事。