我有一个 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。您正在调用 StopCoroutine
或 StopAllCoroutines
。请检查您是否没有停止协程。如果你在它运行时,它就会这样。
2。您正在破坏脚本或该脚本所附加的游戏对象。检查您调用 Destroy(gameObject);
、Destroy(this);
或类似内容的位置。如果脚本被破坏,协程应该停止运行。
请记住,您可以从另一个脚本中销毁一个脚本,因此请检查所有脚本。
3。您禁用了他的脚本附加到的游戏对象。当您禁用游戏对象时,协程将停止工作。检查您是否没有 gameObject.SetActive(false);
或任何带有 SetActive(false);
的内容来禁用该 GameObject。
4。如果您在ScriptA中有一个协程函数,然后从ScriptB启动该协程,如果您销毁ScriptB,ScriptA 中的协程将卡住在yield return 语句处。了解这一点很重要。
5。空问题...
也许objectWithGSScript.scoreText.text
不是null
。您必须检查每个变量并确保它们不为null
。 if
语句很好,但一个好的快捷方式是:
UnityEngine.Debug.Log(objectWithGSScript);
UnityEngine.Debug.Log(objectWithGSScript.scoreText);
UnityEngine.Debug.Log(objectWithGSScript.scoreText.text);
那么你可以这样做:
objectWithGSScript.scoreText.fontSize = 300;
objectWithGSScript.scoreText.text = "" + 3;
我想不出发生这种情况的任何其他可能原因,但请检查上面提到的所有这五件事。
关于c# - 为什么协程停止工作/执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43170554/