我有一个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一样。
可能是什么问题?
任何帮助都将不胜感激。
答案 0 :(得分:3)
代码中的函数非常好。不,它不会也不应该停在3号。
这就是为什么它表现得像是停在3号的原因。
1 。您正在呼叫Assertion Failed: A helper named "tasks/new" could not be found
或StopCoroutine
。请检查您是否没有停止协同程序。如果你正在运行它,那么它将以这种方式运行。
2 。您正在销毁此脚本附加到的脚本或GameObject。检查您拨打StopAllCoroutines
,Destroy(gameObject);
或类似内容的位置。如果脚本被销毁,协程应该停止运行。
请记住,您可以从其他脚本中销毁脚本,以便检查所有脚本。
3 。您已禁用其脚本附加到的GameObject。当您禁用GameObject时,协程停止工作。检查您是否没有Destroy(this);
或gameObject.SetActive(false);
禁用该游戏对象的任何内容。
4 。如果你在 ScriptA 中有一个协同程序功能,然后从 ScriptB 启动该协同程序,如果你销毁 ScriptB < / em>,来自 ScriptA 的协程将在yield return语句中冻结。重要的是你知道这一点。
<强> 5 即可。空问题......
也许SetActive(false);
不是objectWithGSScript.scoreText.text
。您必须检查每个变量,并确保它们不是null
。 null
stametement很好,但这是一个很好的捷径:
if
然后你可以这样做:
UnityEngine.Debug.Log(objectWithGSScript);
UnityEngine.Debug.Log(objectWithGSScript.scoreText);
UnityEngine.Debug.Log(objectWithGSScript.scoreText.text);
我想不出为什么会发生这种情况的其他可能原因,但要检查上面提到的所有这五件事。