为什么协程停止 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。您正在呼叫 StopCoroutine
或 StopAllCoroutines
。请检查您是否没有停止协程。如果你在运行的时候,那么它就会这样。
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 变量并确保它们不是 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;
我想不出发生这种情况的任何其他可能原因,但检查上面提到的所有这五件事。
我有一个 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 时,协程将停止工作。检查你没有 gameObject.SetActive(false);
或任何带有 SetActive(false);
的禁用该 GameObject 的东西。
4。如果您在 ScriptA 中有协程函数,然后从 ScriptB[=59 启动该协程=],如果你销毁 ScriptB,来自 ScriptA 的协程将冻结在 yield return 语句处。了解这一点很重要。
5。空问题...
也许 objectWithGSScript.scoreText.text
不是 null
。您必须检查 each 变量并确保它们不是 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;
我想不出发生这种情况的任何其他可能原因,但检查上面提到的所有这五件事。