Как сделать таймер с циклом в 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(), который ждет до конца кадр и др.
Вы могли бы это прочитать в документации (и до сих пор можете), но я вам расписал понятнее и простым языком. Если вам помог мой ответ, пожалуйста, примите его, поставив галочку.