2015-08-03 4 views
1

Когда я закончить уровень, он должен показать «Уровень Completed!» Текст и подождите 5 секунд, а затем начать следующий уровень.Единство WaitForSeconds ждет больше, чем ожидалось

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 секунд, а текст dissappears. Затем он ждет еще 5 секунд и начать следующий уровень.

Я хочу подождать всего 5 секунд, не скрывая текст.

Любые идеи?

+0

Что именно вы видите в консоли (щелкните правой кнопкой мыши на вкладке «Консоль» -> «Открыть редактор журнала» даст вам текстовый вывод)? Не могли бы вы также опубликовать результат 'Debug.Log (Time.timeScale);' (например, сделать это в 'waitForNextLevel()')? Что содержит метод 'prepareTheLevel()'? – Arx

+0

prepareTheLevel() скрывает текст «Уровень завершен!» и начинает уровень с начала. Я видел, как Unity выполняет первый Debug.Log снова и снова в течение 5 секунд, затем он выполняет второй Debug.Log снова и снова в течение еще 5 секунд. –

ответ

4

Похоже, у вас есть что-то вдоль линий:

if (playerScore > winScore) 
    showSuccess(); 

на игровом объекте где-то.

Если это так, showSuccess вызывается каждый кадр и каждый раз создает новую сопрограмму, которая начинает следующий уровень за 5 секунд. Когда первый заканчивается, уровень уничтожается (который удаляет текст), а следующий уровень начинает загружаться, но у вас есть 5-секундная копия сопрограмм, так что примерно каждый кадр снова вызывает prepareTheLevel, пока не закончите активные сопрограммы.

Ваше решение, чтобы защитить его с помощью bool, очень близко к тому, что вы должны делать, но пропустит основную проблему сложения сопрограмм на 5 секунд - я бы рекомендовал защитить звонок до StartCoroutine - вы могли бы даже использовать активный флаг на текст levelCompleted, то есть:

private void showSuccess() { 
    if (levelCompleted.IsActive() == false) { 
     levelCompleted.SetActive (true); 
     StartCoroutine("waitForNextLevel"); 
    } 
} 

Это сделает это так, второй вызов showSuccess будет видеть, что levelCompleted активен, и ничего не делать, оставив вас с только один сопрограммы, как вы хотите.

+1

Ваш подход правильный. Метод showSuccess() был вызван другим методом, который работает в Update(). Я помещаю предложение if, которое предотвращает теневой вызов метода. –

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; 
     } 
} 
+0

делает почти то же самое, что предложил Тасгалл. В вашем решении waitForNextLevel получает вызов снова и снова, поэтому вам нужно поставить чек «isWaited». Я предлагаю вам использовать решение Tasgall, которое будет более надежным. –

Смежные вопросы