Прим. переводчика: данный урок пригодится тем кто хочет использовать в своих играх реальное время (например, создание Тамагочи). Также урок подойдет для новичков в Unity.
Часы. Простой дисплей.
Этот урок познакомит вас с Unity4 и C# скриптингом. Вы научитесь создавать простые часы, которые будут показывать текущее время.
Вступление.
В этом уроке мы напишем небольшой C# скрипт, который будет осуществлять анимацию стрелок очень простых часов. Вы научитесь: 1)создавать иерархию объекта 2)создавать скрипт и прикреплять его к объекту 3)делать доступ к пространству имен 4)использовать функцию Update 5)поворачивать объект взависимости от времени. Предполагается, что у вас есть общее представление о редакторе Unity.
Создание часов.
Насчем с создания нового Unity проекта без пакетов. Сцена по умолчанию содержит камеру, размещенную на (0,1,-10), смотрящую вглубь оси Z. Чтобы увидеть вид из камеры, нажмем вкладку Game в окне сцены. Чтобы сделать часы, нам нужен корневой элемент объектов. Создадим пустой объект (GameObject – CreateEmpty) и назовем его Clock. Создадим для него три пустых дочерних объекта, назовем их Hours, Minutes и Seconds соответственно. Убедимся что они размещены в (0, 0, 0). Чтобы изобразить стрелки часов используем простые кубы. Создадим их внутри пустышек (GameObject / Create Other / Cube). Кубу часовой стрелки назначим position (0, 1, 0) и scale(0.5,2,0.5). Для минутной стрелки position (0, 1.5, 0), scale (0.25, 3, 0.25). Для секундной position (0, 2, 0), scale (0.1, 4, 0.1).
Анимация часов.
Нам нужен скрипт для анимации. Создадим новый C# скрипт (Create / C# Script) в окне ProjectView и назовем его ClockAnimator. Откроем скрипт. Первая страка в нем говорит о том, что мы будем работать с пространством имен UnityEngine. Затем идет объявление нашего скрипта - ClockAnimator. Он объявлен как публичный класс, наследуемый от MonoBehaviour. Удалим все строки кроме:
Код
using UnityEngine; public class ClockAnimator : MonoBehaviour { }
Сохраним скрипт и прикрепим его к объекту Clock (перетянем из окна Project в окно Hierarchy, или нажмем кнопку AddComponent у объекта).
Чтобы анимировать стрелки, сначала нужно получить доступ к их компонентам Transform. Добавим в скрипте публичные переменные Transform для каждой стрелки, и сохраним его. Эти публичные переменные станут компонентами, которым можно назначить объекты в редаторе. Редактор возьмет у этих объектов компонент Transform и назначит его в наши переменные. Выделем объект Clock и перетащим соответствующие объекты в наши ячейки.
Код
using UnityEngine; public class ClockAnimator : MonoBehaviour { public Transform hours, minutes, seconds; }
Затем добавим в скрипте функцию Update. Эта функция вызывается каждый кадр. Используем ее для вращения наших стрелок. После сохранения скрипта редактор увидит что появилась функция Update, а рядом с названием скрипта появится чекбокс с возможность отключить скрипт. Отключать его, естественно, нам не нужно.
Код
using UnityEngine; public class ClockAnimator : MonoBehaviour { public Transform hours, minutes, seconds; void Update () { // currently do nothing } }
Каждый час часовая стрелка поворачивается на 360 градусов (проходит одно положение из 12). Минутная стрелка поворачивается на 360 градусов (проходит одно из 60 положений каждую минуту). И, наконец, секундная стрелка поворачивается на 360 градусов ( проходит одно из 60 положений каждую секунду). Назначим эти переменные как приватные константы.
Код
using UnityEngine; public class ClockAnimator : MonoBehaviour { private const float hoursToDegrees = 360f / 12f, minutesToDegrees = 360f / 60f, secondsToDegrees = 360f / 60f; public Transform hours, minutes, seconds; void Update () { // currently do nothing } }
Чтобы все работало, нам постоянно нужно знать текущее время. Пространство имен System содержит структуру DateTime, которая для этого подходит. У нее есть статическое свойство, именуемое Now, которое постоянно содержит текущее время. Нам нужно постоянно отображать его в нашей временной переменной. В скрипте, под строчкой "using UnityEngine;", добавим строку "using System;", чтобы получить доступ к нему.
Код
using UnityEngine; using System; public class ClockAnimator : MonoBehaviour { private const float hoursToDegrees = 360f / 12f, minutesToDegrees = 360f / 60f, secondsToDegrees = 360f / 60f; public Transform hours, minutes, seconds; void Update () { DateTime time = DateTime.Now; } }
Чтобы стрелки крутились, нужно изменить их локальное вращение. Мы это сделаем, изменив непосредственно localRotation, используя кватернионы. Quaternion - отличный метод, который мы можем использовать для обозначения произвольного вращения. Потому как мы смотрим вглубь сцены по оси Z, и Unity использует левостороннюю систему координат, вращение должно быть против часовой стрелки вокруг оси Z.
Все работает! Запустив плей мод, убедимся что часы показывают текущее время. Однако, они показывают время дискретными шагами, как цифровые часы. Давайте позволим нашим часам показывать аналоговое время. Добавим публичную переменную analog в скрипт и определим ее действия в функции Update. Мы сможем переключать эту переменную в редакторе, даже во премя play mode режима.
Код
using UnityEngine; using System; public class ClockAnimator : MonoBehaviour { private const float hoursToDegrees = 360f / 12f, minutesToDegrees = 360f / 60f, secondsToDegrees = 360f / 60f; public Transform hours, minutes, seconds; public bool analog; void Update () { if (analog) { // currently do nothing } else { DateTime time = DateTime.Now; hours.localRotation = Quaternion.Euler(0f, 0f, time.Hour * -hoursToDegrees); minutes.localRotation = Quaternion.Euler(0f, 0f, time.Minute * -minutesToDegrees); seconds.localRotation = Quaternion.Euler(0f, 0f, time.Second * -secondsToDegrees); } } }
Для реализации аналогового метода нам потребуется несколько иной подход. Вместо DataTime.Now мы будем использовать DataTime.Now.TimeOfDay, структуру TimeSpan. Это позволит нам получить доступ к фракционному прохождению часов, минут и секунд. Поскольку эти переменные удваиваются, нужно преобразовать их тип во float.
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Часы в Unity3d.», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.