协同程序为何停止工作/执行

我有一个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一样。

可能是什么问题呢?

任何帮助,将不胜感激。

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

这些可能是因为它在3号位置被停止的原因。

1.您正在调用StopCoroutineStopAllCoroutines 。 请检查您是否没有停止协同程序。 如果您在运行时,它将以这种方式运行。

2.您正在销毁此脚本附加到的脚本或GameObject。 检查你在哪里调用Destroy(gameObject);Destroy(this); 或类似的东西。 如果脚本被销毁,则协程应该停止运行。

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

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

4.如果你在ScriptA中有一个协同程序函数,然后从ScriptB启动该协程,如果你破坏ScriptBScriptA中的协同程序将冻结在yield return语句中。 你知道这一点很重要。

5 。 空问题……

也许objectWithGSScript.scoreText.text不为null 。 您必须检查每个变量并确保它们不为nullif stametement很好,但这是一个很好的捷径:

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

然后你可以这样做:

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

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