Рубрики: C Sharp

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

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

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

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

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

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

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

using System;
using UnityEngine;
using UnityEngine.UI;

public class Timer : MonoBehaviour
{
    private float timeInSecondsP;
    public static int minutsP;
    public static int secondsP;
    public Text minutes;
    public Text seconds;

    internal void Update()
    {
        if (PlayerController._gameover == false)
        {
            if (Teach.DoneTeach == true)
            {
                timeInSecondsP += Time.deltaTime;

                secondsP = (int)(timeInSecondsP % 60);
                minutsP = (int)(timeInSecondsP / 60);

                if (minutsP < 10)
                {
                    minutes.text = 0 + minutsP.ToString();
                    if (secondsP < 10)
                    {
                        seconds.text = 0 + secondsP.ToString();
                    }
                    else
                    {
                        seconds.text = secondsP.ToString();
                    }
                }
                else
                {
                    minutes.text = 0 + minutsP.ToString();
                    if (secondsP < 10)
                    {
                        seconds.text = 0 + secondsP.ToString();
                    }
                    else
                    {
                        seconds.text = secondsP.ToString();
                    }
                }
            }
            else
            {
                string secondsP;
                string minutsP;
            }
        }
    }
}

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

Кусок:

timeInSecondsP += Time.deltaTime;

                secondsP = (int)(timeInSecondsP % 60);
                minutsP = (int)(timeInSecondsP / 60);

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

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

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

if (minutsP < 10)
                {
                    minutes.text = 0 + minutsP.ToString();
                    if (secondsP < 10)
                    {
                        seconds.text = 0 + secondsP.ToString();
                    }
                    else
                    {
                        seconds.text = secondsP.ToString();
                    }
                }
                else
                {
                    minutes.text = 0 + minutsP.ToString();
                    if (secondsP < 10)
                    {
                        seconds.text = 0 + secondsP.ToString();
                    }
                    else
                    {
                        seconds.text = secondsP.ToString();
                    }
                }

То есть если значение больше 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 закрывающие закрывающие фигурные скобки, иначе скрипт работать не будет!):
    if (PlayerController._gameover == false)
            {
                if (Teach.DoneTeach == true)
                {
                  Тело внутри этих скобок не удалять! То что помечено жирным - удалить!
                }
            }
  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-канале!

0

Автор публикации

не в сети 1 час

Vapi

0
Комментарии: 19Публикации: 104Регистрация: 14-04-2017
Vapi

Посмотреть комментарии

  • 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

Новаястатья

SQL – получаем активные соединения

Добрый день. В этой статье мы с вами научимся писать запросы, которые выводят активные соединения…

2 недели назад

Готовые шаблоны/шапки YouTube PSD #5

Здравствуйте, уважаемые читатели! Было принято решение 12 числа каждого месяца специально для вас делать ежемесячный…

2 недели назад

HTML – IMG

Всем привет дорогие читатели. В этом посте мы с вами узнаем как вставить картинку в…

2 недели назад

CSS – Отступы

Сегодня мы поговорим про отступы в CSS. В предыдущих статьях неоднократно они использовались для примеров,…

2 недели назад

JavaScript – меняем CSS

Немного отойдем от изучения powershell и добавим JavaScript. Сегодня мы научимся менять CSS на странице…

2 недели назад

Powershell – Операторы сравнения

Уже неоднократно в наших статьях встречались операторы сравнения, например, когда мы разбирали Where-Object. В этой…

2 недели назад
Авторизация
*
*

Login form protected by Login LockDown.


Регистрация
*
*
*
Пароль не введен
Генерация пароля