Unity WaitForSeconds等待超过预期

时间:2015-08-03 21:11:17

标签: c# unity3d timer

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

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

听起来你有以下几点:

const std::vector<Directions>& horizontalDirections() {
    static const std::vector<Directions> toReturn = {
        Left,
        Right
    };
    return toReturn;
}

在某处的游戏对象上。

如果是这种情况,则每帧都会调用if (playerScore > winScore) showSuccess(); ,并且每次创建一个新的协程,在5秒内启动下一个级别。当第一个完成时,级别被破坏(删除文本)并且下一个级别开始加载 - 但是你有5秒钟的协同程序堆叠,所以大约每个帧都会再次调用showSuccess,直到你用完为止活跃的协程。

你用bool来保护它的解决方案非常接近你应该做的事情,但是错过了堆积5秒钟协同程序的根本问题 - 我建议保护对prepareTheLevel的呼叫 - 你甚至可以在levelCompleted文本上使用活动标志,即:

StartCoroutine

这样,第二次调用private void showSuccess() { if (levelCompleted.IsActive() == false) { levelCompleted.SetActive (true); StartCoroutine("waitForNextLevel"); } } 就会看到showSuccess处于活动状态,并且不执行任何操作,只留下一个levelCompleted coroutine。

答案 1 :(得分:0)

好的,我一如既往地解决了我的问题。然而,这对我来说并不令人满意。我看到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;
        }
}