为什么协程停止 working/executing

Why coroutine stops working/executing

我有一个 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;
    }
}

它只打印一次"entered",看起来它从协程中退出,就像它永远返回null一样。

可能是什么问题?

如有任何帮助,我们将不胜感激。

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

这些是它在数字 3 处停止运行的可能原因。

1。您正在呼叫 StopCoroutineStopAllCoroutines。请检查您是否没有停止协程。如果你在运行的时候,那么它就会这样。

2。您正在破坏脚本或此脚本附加到的游戏对象。检查您调用 Destroy(gameObject);Destroy(this); 或类似名称的位置。如果脚本被破坏,协程应该停止运行。

请记住,您可以从另一个脚本中销毁一个脚本,因此请检查所有脚本。

3。您禁用了他的脚本附加到的游戏对象。当您禁用 GameObject 时,协程将停止工作。检查你没有 gameObject.SetActive(false); 或任何带有 SetActive(false); 的禁用该 GameObject 的东西。

4。如果您在 ScriptA 中有协程函数,然后从 ScriptB[=59 启动该协程=],如果你销毁 ScriptB,来自 ScriptA 的协程将冻结在 yield return 语句处。了解这一点很重要。

5。空问题...

也许 objectWithGSScript.scoreText.text 不是 null。您必须检查 each 变量并确保它们不是 nullif 语句很好,但一个好的快捷方式是:

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

那么你可以这样做:

objectWithGSScript.scoreText.fontSize = 300;
objectWithGSScript.scoreText.text = "" + 3;

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