Пишем таймер в Unity

unityВ каждой аркаде для подсчета очков учитывается такой компонент как таймер/время. Это время может относиться к любой части вашей игры: таймер с обратным отчетом, время прохождения уровня, время прохождения игры и т.д. Безусловно стандартный интерфейс в Unity очень полезная штука, но в рамках кастомизации и при наличии своего интерфейса необходимо оперировать объектами — кодом. В прошлой статье вы научились вращать объекты кодом. Сегодня мы научимся писать таймер, который задействует текстовые объекты Unity.

Пишем таймер в Unity

Я не особо — то дизайнер… Но стандартный вид мне не нравился, поэтому я создал свой интерфейс, примитивно конечно, но выглядит лучше, чем было:

Если вы обратили внимание на ветку «All Panels», наверняка заметили, что в иерархии имеется 3 объекта: TimeText, Current Seconds и Current Minutes. В эту панельку так же влетел спидометр, что не есть хорошо, но это был первый опыт, поэтому не судите строго. Приведу пример от Current Seconds, так как это самая динамичная единица в любом таймере (если нет миллисекунд). Это текстовый объект со значением: 00 (два нуля). Думаю воспроизвести подобную панельку вам труда не составит, поэтому переходим к коду.

Во-первых: скрипт с работой таймера находится в папке ScriptableObjects.
Во-вторых: изменение текстового значение идет через метод.

А вот и сам код таймера:

Сложна? Сложна. Хотелось сделать так, чтобы таймер начинался только после закрытия экрана обучения. Соответственно можно увидеть флаги DoneTeach, как раз отвечающие за этот экран. Давайте разбираться. Думаю с переменными все понятно.

Кусок:

Во-первых первая строчка отвечает за одну единицу времени, и ее увеличение. Далее мы обозначаем что secondsP это 60% от первой переменной, к которой постоянно прибавляется время. Минуты соответственно разделенное на 60. Окей, на этом можно было остановиться, но только в том случае, если был интерфейс от Unity… В кастомном интерфейсе все сложнее, поэтому пришлось создавать условия.

Таймер через интерфейс

Условия эти заключались в том, что кастомный таймер при тестах вел себя не так как надо. А именно вид у него становился такой: 00: 1 — это сами понимаете никуда не годится. Было принято решение принудительно дорисовывать нуль к самой переменной, но далее возникла проблема, когда секунд становилось более 10, таймер принимал вид 00:010 — это тоже ни в какие ворота. Соответственно, чтобы исправить данную ситуацию появились такие зависимости:

То есть если значение больше 10, то нуль, который мы дописывали принудительно — исчезает. После этого все встало на свои места и таймер начал нормально работать в виде 01:02 без каких-либо ошибок и сбоев. Если вы обратили внимание, то мы не просто работаем с переменными — мы работаем с их компонентами — «minutes.text». Далее мы каждый раз при изменении значений minutes или seconds приводим их к виду строки, используя встроенный метод ToString(), таким образом текстовое значение, которое мы видим в самой игре — меняется.

Хочу себе такой же таймер в Unity!

Хорошо, что нужно сделать:

  1. Создать 2 объекта типа текст.
  2. Назвать их Current Seconds и Current Minutes.
  3. Создать пустой объект.
  4. Назвать его Time.
  5. В пустом объекте нажимаем Add Component -> New Script — называем Timer.
  6. Сворачиваем открывшийся редактор и возвращаемся к самому первому скрипту в этой статье.
  7. Полностью копируем его и вставляем в редактор.
  8. Убираем строчки (не забудьте в нижней части скрипта убрать 2 закрывающие закрывающие фигурные скобки, иначе скрипт работать не будет!):
  9. Сохраняем.
  10. Возвращаемся в редактор Unity.
  11. На пустом объекте Time в окне с компонентом «Timer(Script)» должны были появиться 2 новые строчки: Minutes, Seconds.
  12. Из иерархии вашей сцены тянем объект Current Minutes в поле Minutes.
  13. Повторить пункт 12 для Current Seconds/Seconds.
  14. Нажать кнопку Play.
  15. Радоваться, что все работает 🙂

Итоги.

Честно говоря, не думал, что получится такая большая статья про таймер в Unity. Если у вас возникли ошибки при попытке запустить режим Play в едиторе, значит вы что-то сделали не так. Можете оставить ошибку в комментариях, поможем. Теперь вы умеете создавать красивый кастомный таймер в Unity. Естестсвенно теперь можете изменять графический компонент текста этих объектов как захотите, они привязаны в скрипте и это все, что требовалось сделать для его корректной работы (главное ничего не удалять). Ждем вас в нашей группе в ВК и на Youtube-канале!

2 Комментария

  1. Кузя

    public class Timer2
    {
    private TimeSpan timer = new TimeSpan();
    public Text minutes;
    public Text seconds;

    internal void Update()
    {
    if (!PlayerController._gameover && Teach.DoneTeach)
    {
    timer = timer.Add(TimeSpan.FromSeconds(Time.deltaTime));
    minutes.text = timer.Minutes.ToString(«00»);
    seconds.text = timer.Seconds.ToString(«00»);
    }
    }
    }

    • Vapi

      Отличный пример! Спасибо!

Лицензионное соглашение

Авторские права публикуемых материалов полностью или частично принадлежат авторам сайта Pechenek.NET в соответствии со статьями 1252 и 1301 ГК РФ. Любое распространение должно быть согласовано с автором материала или с указанием ссылки на первоисточник.