【问题标题】:Unity WaitForSeconds waits more than expectedUnity WaitForSeconds 等待的时间超出预期
【发布时间】:2015-08-03 21:11:16
【问题描述】:

当我完成关卡时,它必须显示“Level Completed!”文本并等待 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 秒而不隐藏文本。

有什么想法吗?

【问题讨论】:

  • 您在控制台中究竟看到了什么(右键单击控制台选项卡 -> Open Editor Log 将为您提供文本输出)?您能否也发布Debug.Log(Time.timeScale); 的结果(例如在waitForNextLevel() 中进行)?方法prepareTheLevel() 包含什么?
  • prepareTheLevel() 确实隐藏了文本“级别已完成!”并从头开始水平。我看到 Unity 在 5 秒内一遍又一遍地执行第一个 Debug.Log,然后在另外 5 秒内一遍又一遍地执行第二个 Debug.Log。

标签: c# unity3d timer


【解决方案1】:

听起来你有一些类似的东西:

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 协程。

【讨论】:

  • 你的方法是对的。 showSuccess() 方法被另一个在 Update() 上运行的方法调用。我放了一个 if 子句来防止该方法被徒劳地调用。
【解决方案2】:

好的,我一如既往地解决了我的问题。然而这对我来说并不令人满意。我看到 Unity 一遍又一遍地执行 WaitForLevel 方法下面的代码 5 秒。为什么会这样? :S

下面的代码解决了我的问题

private bool isWaited = false;

IEnumerator waitForNextLevel() {
         Debug.Log ("Start time: " + Time.time);
         yield return new WaitForSeconds (5);
         Debug.Log ("End time: " + Time.time);
         if (!isWaited) {
            prepareTheLevel ();
            isWaited = true;
        }
}

【讨论】:

  • 它所做的几乎与 Tasgall 提出的相同。在您的解决方案中,waitForNextLevel 被一遍又一遍地调用,这就是您必须检查“isWaited”的原因。我会建议你使用 Tasgall 解决方案,它会更健壮。
猜你喜欢
  • 2015-09-09
  • 1970-01-01
  • 2018-07-13
  • 2020-05-19
  • 2020-05-09
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多