Как сделать таймер в unity

Обновлено: 07.07.2024

Предполагается, что у вы уже знакомы с этим игровым движком. Если нет, изучите вводные уроки по Unity.

Создаем часы в Unity

Мы начнем с создания нового проекта Unity без каких-либо пакетов. По умолчанию сцена содержит камеру, расположенную в точке (0, 1, -10) , смотрящую вниз относительно оси Z. Чтобы сделать такую же перспективу как у камеры на вкладке Scene, выбетите камеру и установите GameObject / Align View to Selected из меню.

Нам нужна структура объекта, который будет представлять собой часы. Создайте новый пустой GameObject с помощью GameObject / Create Empty, установите его position (положение) в (0,0,0) и назовите его Clock. Создайте три пустых дочерних объекта для него и назовите их Hours, Minutes и Seconds. Убедитесь, что все они также расположены в (0,0,0) .

Что такое GameObject (Игровой объект)?

В принципе, все, что находится в кадре является игровым объектом. Он имеет имя, тег, слой, компонент Transform и может быть помечен как статический. Сама по себе он ничего не делает, - это просто пустой контейнер. Вы можете превратить его в нечто полезное путем присоединения компонентов к нему или помещая в него другие объекты.

Что такое дочерний объект?

Если вы поместите объект внутрь другого (путем перетаскивания во вкладку Иерархия), то он считается потомком объекта, в котором он находится. Трансформация родителя наследуется его детьми и применяется в первую очередь. Таким образом позиция дочернего объекта задана как (10, 0, 0) , тогда как у родителя она (2, 1, 0) , а в итоге позиция дочернего объекта станет (12, 1, 0) . Но если вращение родителя также задано как (0, 0, 90) , дочерний объект вращается вокруг родителя и становится повернутым (0, 0, 90) на позиции (2, 11, 0) . Масштаб наследуется таким же образом.

Мы будем использовать простые коробки, чтобы визуализировать стрелки часов. Создайте дочерние кубы для каждой стрелки с помощью GameObject / Create Other / Cube. Задайте кубику Hours position (положение) (0, 1, 0) и scale (масштаб) (0.5, 2, 0.5) . Для куба minutes position будет (0, 1.5, 0) , а мосштаб (0.25, 3, 0.25) . Для куба seconds соответственно (0, 2, 0) и (0.1, 4, 0.1) .


Конструкция часов и иерархия.

Анимируем часы

Что такое пространство имен?
Что такое class (класс)?

Класс (class ) – это некая программа, которая может быть использована для создания объектов, которые находятся в памяти вашего компьютера. Класс определяет, какие данные содержатся в объектах и как они себя ведут.

Что такое MonoBehaviour?

MonoBehaviour является классом из пространства имен UnityEngine . Если вы создаете класс, который вы хотите использовать в качестве компонента Unity, то он должен наследовать от MonoBehaviour. В нем содержится много полезных вещей, а еще он заставляет работать такие вещи как Update .

Это дает нам минимальный класс, который можно использовать для создания компонентов. Сохраните его, а затем присоедините к объекту Clock, перетащив из вкладки Project во вкладку Hierarchy (Иерархия), либо через кнопку Add Component (добавить компонент).


ClockAnimator приаттачен к Clock.

Чтобы анимировать стрелки, сперва нужно добраться до их компонентов Transform . Добавьте публичную переменную Transform для каждой стрелки скрипта, а затем сохраните. Эти переменные станут свойствами компонента, которые можно будет присвоить объекту в редакторе. Затем редактор соберет компоненты Transform из этих объектов и присвоит их нашим переменным. Выберите объект Clock и перетащите соответствующие объекты к новым свойствам.

Что такое переменная?

Переменная - это значение, которое может быть изменено. Оно может быть либо ссылкой на объект или чем-то простым вроде целого числа. Переменная должна быть определенного типа, который записывается перед ее именем, когда она задаtтся.

Переменные существуют только внутри облоасти видимости, в которой определены. По умолчанию, если переменная задана внутри класса (class), то каждый объект этого класса имеет собственную версию этой переменной. Однако, можно отметить их статичными (static), и в этом случае они будут существовать только для того класса (class), независимо от остальных объектов. Если переменная определена внутри метода, вы можете вспоминать о их существовании только когда метод вызывается.

ClockAnimator с пустыми и заполненными свойствами.

Далее, мы добавим метод Update в скрипте. Это специальный метод, который будет вызываться один раз каждый кадр. Мы будем использовать его для вращения стрелок часов.

Что такое метод?
Shouldn't Update be public ?

Update и набор других методов считаются особенностью Unity. Unity найдет их и вызовет их при необходимости, независимо от того, как мы их объявим.

Мы не должны объявлять метод Update публичным, потому что он не должен ссылаться на что-либо иное, кроме как на движок Unity. Философия состоит в том, чтобы сделать все приватным, и не нужно было к этому обращаться извне класса. Все, что приватное, не должно быть вперемешку с остальным. Это снижает вероятность ошибок.

Мы могли бы опустить private объявление, потому что методы и поля являются приватными по умолчанию. Я предпочитаю показывать все наглядно, поэтому специально так и делаю, а не просто говорю в двух словах.

После сохранения скрипта, редактор заметит, что наш компонент имеет метод update и покажет флажок, который позволяет нам вывести етключить его. Разумеется, он должен быть включен.


Обновление ClockAnimator’а, украшенное чекбоксами.

Каждый час часовая стрелка Hours должна вращаться 360/12 градусов. Стрелка Minutes поворачивается на 360/60 градусов каждую минуту. Наконец, стрелка Seconds поворачивается на 360/60 градусов каждую секунду. Определим эти значения как приватные константы с плавающей запятой для удобства.

Что особенного в const?

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

Кстати, компилятор будет предварительно вычислить любое постоянное выражение, так что (1 + 1) и 2 дадут один и тот же результат

Каждое обновление нам нужно знать текущее время, чтобы эта фишка работала. Пространство имен System содержит DateTime struct, который подходит для этой работы. Он имеет статическое свойство с именем Now который всегда содержит текущее время. В каждом обновлении мы должны хранить его во временной переменной.

Что такое struct?

struct -это программа, также как и class. Различие в том, что всё, что она создает, обрабатывается как обычное значение, как целое число, а не как объект. У нее нет такого же распознания как у объекта.

Что такое свойство?

Свойство представляет собой метод, который претендует быть переменной. Оно может быть только для чтения или только для записи.

Обратите внимание, что переменные, обработанные редактором Unity также обычно называются свойствами, но это не то же самое.

Чтобы заставить стрелки двигаться, нужно изменить их местное вращение. Мы это сделаем, напрямую задавая стрелкам localRotation с помощью кватернионов. У Quaternion есть хороший метод, который можно использовать для определения произвольного вращения.

Т.к. мы смотрим на ось Z, а Unity использует левостороннюю систему координат, вращение по оси Z должно быть отрицательным.


Часы, показывающие 12:44.

Что такое кватернион?

Кватернионы основаны на комплексных числах и используются для обозначения 3D вращения. Хоть их и сложнее понимать, чем простые 3D-векторы, они имеют некоторые полезные характеристики. Пространство имен UnityEngine содержит Quaternion структуру.

Почему мы не используем rotation ?

localRotation ссылается непосредственно на вращение Transform , независимому от вращения своего родителя. Таким образом, если нам надо было бы повернуть объект Clock, его стрелки вращались бы вместе с ним.

rotation ссылается на итоговое вращение Transform т.к. на него мы и смотрим, учитывая вращение родителя. Стрелки не будут подстраиваться при вращении объекта Clock, т.к. его вращение будет компенсированным.

Улучшаем часы

Это работает! В режиме воспроизведения наши часы показывают текущее время, тем не менее, они ведут себя так же, как цифровые часы, поскольку показывает только дискретные шаги. Давайте включим возможность показивать аналоговое время. Добавьте публичную логическую переменную analog в скрипт и использовать ее, чтобы определить, что делать в методе Update. Мы можем переключать это значение в редакторе даже в режиме воспроизведения.


ClockAnimator с поддержкой аналогового вида.

Для аналогового варианта нам нужен несколько иной подход. Вместо DateTime.Now мы будем использовать DateTime.Now.TimeOfDay , которая представляет собой TimeSpan . Это позволяет нам легко получать доступ к дробным долям прошедших часов, минут и секунд. Эти значения представлены как двойные, т.е. значения с двойной точностью и плавающими запятыми, нам надо разделить их на две части.

Что такое кастинг?

Кастинг изменяет тип значения. Вы указываете это, написав тип в круглые скобки перед значением. Изменение простых значений дает нам такой переход, как переход от значения с плавающей запятой в целое число, отсекая дробную часть.

Кастинг объекта не изменяет его, а только меняет то, как будет обрабатываться ссылка. Этим лучше заниматься только когда вы на 100% уверены в типе объекта.


Часы в аналоговом виде, показывающие 12:56.

Читайте также: