Задать вопрос
Dan83
@Dan83
Программист самоучка, разработчик одиночка

Таймер через корутины?

Доброго времени суток!
Нужно сделать обратный таймер в игре по нажатию игрока на кнопку.
Почитал, советуют корутину, попробовал, не получилось...
Есть корутина:

IEnumerator SuperTimer()
    {

        yield return new WaitForSecondsRealtime(5.0f);

        SoundsPlay(clockSound);

        timerSuper -= 5;

        TextTimerSuper.text = timerSuper.ToString();
    }


Кто то советует именно WaitForSecondsRealtime

Но и WaitForSeconds

Все ровно не работает!

Старт счетчика происходит по нажатию на кнопку.

public void Sloznost_8()
    {
        SoundsPlay(levelUpSound);

        StartCoroutine(SuperTimer());

    }


И корутина стартует, но только один раз!

То есть производится звук "тика" часов и таймер меняется с 60 на 55.

И все... Дальше "тика" и смены числа нет, ошибок в консоли нет, ошибок в редакторе нет.

Вся игра работает дальше, как ей и положено!

Останавливается корутина по нажатию на ДРУГУЮ кнопку.

public void Sloznost_1()
    {
        StopSuper();

    }


Сама функция:

public void StopSuper()
    {
        StopCoroutine(SuperTimer());

        TextTimerSuper.text = "?";
    }


Я как то корутины не правильно понял? Да, в Годо таймер как то проще...

Спасибо!
  • Вопрос задан
  • 16 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Академия Эдюсон
    Разработчик игр на Unity + ИИ
    6 месяцев
    Далее
  • Нетология
    Разработчик игр на Unity
    13 месяцев
    Далее
  • XYZ School
    C# для разработки игр
    5 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
в корутине нет цикла: она дошла до конца после первого WaitForSecondsRealtime и завершилась, отсюда один "тик" 60→55. Оберни в while:

IEnumerator SuperTimer()
{
    while (timerSuper > 0)
    {
        yield return new WaitForSecondsRealtime(5f);
        timerSuper -= 5;
        SoundsPlay(clockSound);
        TextTimerSuper.text = timerSuper.ToString();
    }
}


И StopCoroutine(SuperTimer()) ничего не останавливает, это новый экземпляр итератора. Сохрани то, что вернул StartCoroutine: superCo = StartCoroutine(SuperTimer()); и if (superCo != null) StopCoroutine(superCo);

p.s. Realtime тикает и при timeScale=0, обычный WaitForSeconds на паузе встанет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы