Как сделать таймер с циклом в 30 секунд?

Всем привет. Как сделать таймер с циклом в 30 секунд, то есть таймер который при достижении 0 секунд будет включаться снова? Есть такой код

public float timeStart = 30;
public Text timerText;

void Start()
{
    timerText.text = timeStart.ToString();
}


void Update()
{     
        timeStart -= Time.deltaTime;
        timerText.text = Mathf.Round(timeStart).ToString();   
}

В общем получился вот такой говнокод, но он рабочий :D

public float timeStart = 30f;
public Text timerText;

void Start()
{
    timerText.text = timeStart.ToString();
}


void Update()
{     
    timeStart -= Time.deltaTime;
    timerText.text = Mathf.Round(timeStart).ToString();  
    if ( timeStart <= 0f)
    {
        timeStart = 30f;
        timeStart -= Time.deltaTime;
        timerText.text = Mathf.Round(timeStart).ToString();
    }
}

С удовольствием приму критику и учту ошибки:)


Ответы (1 шт):

Автор решения: Максим Фисман

Для действий, которые не зависят от обновления кадров, а работают по времени исользуют корутины. Мое описание дурацкое, лучше почитайте в документации. Очень коротко, корутина - это функция, которая не обязана выполнится за 1 кадр, в котором она была вызвана.

Корутина может подождать некоторое количество секунд с помощью строки:

yield return new WaitForSeconds(float time); // time - время

Подождать она может даже несколько раз, т.е. то, что в этой строке есть слово return не значит, что функция после этого завершится.

Допустим, вы хотите, чтобы через 5 секунд после запуска приложения вывело Goodbye World 3 раза, между которыми пройдет по 3 секунды.

Goodbye World - Неожиданно, не правда ли?

private void Start () {
    StartCoroutine(writePhrase()); // Обратите внимание, что корутина зупскается по-особенному, с помощью StartCoroutine()
}
private IEnumerator writePhrase () {
    yield return new WaitForSeconds(5); // Начальная задержка
    for (int i = 0; i < 3; i++) {
        print("Goodbye World"); // Вывод
        yield return new WaitForSeconds(3); // Задержка между фразами
    }
}

Обратите внимание, что хотя корутина и будет ждать, тот код, откуда она была вызвана продолжится и закончит выполнение в этом же кадре. Например, если мы в предыдущей программе в методе Start() перед вызовом корутины добавим строчку print("BEFORE");, а после вызова корутины строчку print("AFTER"); То вывод будет выглядеть как:

  • BEFORE
  • AFTER
  • Goodbye World
  • Goodbye World
  • Goodbye World

То есть Start() продолжил выполнение, несмотря на то, что вызванная им корутина еще не закончила выполнение и ждала.

Помимо WaitForSeconds(), который ждет X секунд, есть, например, WaitForEndOfFrame(), который ждет до конца кадр и др.

Вы могли бы это прочитать в документации (и до сих пор можете), но я вам расписал понятнее и простым языком. Если вам помог мой ответ, пожалуйста, примите его, поставив галочку.

→ Ссылка