当我完成关卡时,它必须显示“关卡已完成!”文本并等待 5 秒然后开始下一关。
private void showSuccess() {
levelCompleted.SetActive (true);
StartCoroutine("waitForNextLevel");
}
IEnumerator waitForNextLevel() {
Debug.Log ("Start time: " + Time.time);
yield return new WaitForSeconds (5);
Debug.Log ("End time: " + Time.time);
prepareTheLevel ();
}
然而文字出现成功,游戏等待5秒,文字消失。然后再等待 5 秒并开始下一个级别。
我希望它只等待 5 秒而不隐藏文本。
有什么想法吗?
最佳答案
听起来你有一些类似的东西:
if (playerScore > winScore)
showSuccess();
在某处的游戏对象上。
如果是这种情况,每帧都会调用 showSuccess
,并且每次它都会创建一个新协程,在 5 秒内开始下一关。当第一个完成时,关卡被销毁(删除文本)并且下一个关卡开始加载 - 但是你有 5 秒的协程堆积起来,所以大致每一帧它都会再次调用 prepareTheLevel
直到你用完了活跃的协程。
你用 bool 来保护它的解决方案非常接近你应该做的,但忽略了堆积 5 秒协程的潜在问题 - 我建议保护对 StartCoroutine
的调用相反 - 你甚至可以在 levelCompleted 文本上使用 active 标志,即:
private void showSuccess() {
if (levelCompleted.IsActive() == false) {
levelCompleted.SetActive (true);
StartCoroutine("waitForNextLevel");
}
}
这将使第二次调用 showSuccess
将看到 levelCompleted
处于事件状态,并且什么都不做,只剩下一个 waitForNextLevel
随心所欲的协程。
关于c# - unity WaitForSeconds 等待时间超过预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31796836/