c# - unity WaitForSeconds 等待时间超过预期

标签 c# unity3d timer

当我完成关卡时,它必须显示“关卡已完成!”文本并等待 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/

相关文章:

android - Android 中的 play-services-base 与 -basement 依赖关系 (AAR)

c# - Unity - GameObject 上的 SetActive() 不适用于子对象

android - Vuforia 和 Unity 1.5 不在 Android 场景中渲染对象

javascript - 使用 Javascript 的在线测验计时器

android - 我可以从 java.util.TimerTask::run() 运行 Activity 类方法吗?

swift - 如果 LongPressReconizerState 结束,预定的计时器不会结束

C# Entity Framework 属性(有时)为空

c# - 在 C# 中填充对象

C#VSTO : Coloring pivottable cells

c# - 将 IEnumerable<XElement> 转换为 List<嵌套对象>