Нужно реализовать отсчет времени на экране 3 2 1 Go!
Сделал обычный отсчет времени от 3 секунд до 0. Но нужно чтобы вместо 0 писалось (Go!) и отсчет времени при этом останавливался
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Timer : MonoBehaviour
{
public float timeStart = 3;
public Text timerText;
void Start()
{
timerText.text = timeStart.ToString();
}
void Update()
{
timeStart -= Time.deltaTime;
timerText.text = Mathf.Round(timeStart).ToString();
}
}
Ответы (2 шт):
Можно реализовать через Coroutine.
Вызывается в Start(). IEnumerator используют yield. yield return возвращает нeкое значение и переходит к следующему блоку кода, в данном случае используется yield return new WaitForSeconds(n); где n - время в секундах.
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
public class Timer : MonoBehaviour
{
public float timeStart = 3;
public Text timerText;
void Start()
{
timerText.text = timeStart.ToString();
StartCoroutine(TimerCoroutine());
}
IEnumerator TimerCoroutine()
{
while (true)
{
yield return new WaitForSeconds(1f);
--timeStart;
if (timeStart == 0)
{
timerText.text = "Go";
break;
}
else
{
timerText.text = timeStart.ToString();
}
}
}
}
[SerializeField] private Text Timer; // Объект таймера
[Header("Параметры таймера")]
[SerializeField] private int Delay = 3f; // Сколько ждем
[SerializeField] private string TimesUpText = "GO!"; // Какой текст покажем, когда время истечет
private IEnumerator TimerCountdown() // Обратный отсчет таймера
{
while (Delay > 0)
{
SetTimerText(Delay--);
yield return new WaitForSeconds(1f);
}
SetTimerText("GO!");
}
private void SetTimerText (string text) {
Timer.text = text;
// Здесь можно добавить какую-либо анимацию, например, что текст появляется "ударами": большой, потом уменьшается; либо изменяется цвет и т.д.
}
Если хотите, чтобы после показа "GO!" текст исчез в конец корутины TimerCountdown добавьте следующие строки:
yield return new WaitForSeconds(1f); // Сколько ждем
Timer.text = "";
Если вы захотите сделать ожидание дробным или, например, показывать обратный отсчет с десятыми/сотыми, то Delay нужно сделать float. Но я такого в гонках почти никогда не видел.
Этот код можно поместить в класс Timer, повешенный на объект таймера. В таком случае переменную Timer можно сделать приватной и кэшировать в Awake:
private void Awake () {
Timer = GetComponent<Timer>();
}
Ну и еще в такое случае было бы неплохо добавить перед объявлением класса
[RequireComponent(typeof(Text))]
Ссылки:
- Coroutine: https://docs.unity3d.com/Manual/Coroutines.html
- WaitForSeconds: https://docs.unity3d.com/ScriptReference/WaitForSeconds.html
- RequireComponent: https://docs.unity3d.com/ScriptReference/RequireComponent.html