Воскресенье, 22 Декабря 2024, 05:08

Приветствую Вас Гость

Меню сайта
Категории каталога
Создание игр [358]
Статьи об общих понятиях связанных с созданием игр.
Программирование [85]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [151]
Статьи о программах для создания игр, уроки и описания.
Софт [44]
Различные программы, в том числе в помощь игроделам.
2D-графика [14]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [17]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [5]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [169]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [133]
Статьи, которые не вошли в определённые разделы.
Наш опрос
На какие из этих игровые системы вы разрабатываете игры?
Всего ответов: 1652
Главная » Статьи » Создание игр

Часы в Unity3d.
Прим. переводчика: данный урок пригодится тем кто хочет использовать в своих играх реальное время (например, создание Тамагочи). Также урок подойдет для новичков в 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.

Код

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;
  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);
  }
}



часы показывают 12:44


Улучшение часов.

Все работает! Запустив плей мод, убедимся что часы показывают текущее время. Однако, они показывают время дискретными шагами, как цифровые часы. Давайте позволим нашим часам показывать аналоговое время. Добавим публичную переменную 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.

Код

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) {
  TimeSpan timespan = DateTime.Now.TimeOfDay;
  hours.localRotation =
  Quaternion.Euler(0f,0f,(float)timespan.TotalHours * -hoursToDegrees);
  minutes.localRotation =
  Quaternion.Euler(0f,0f,(float)timespan.TotalMinutes * -minutesToDegrees);
  seconds.localRotation =
  Quaternion.Euler(0f,0f,(float)timespan.TotalSeconds * -secondsToDegrees);
  }
  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);
  }
  }
}


В редакторе переменную analog переведем в положение true (поставим галочку). Запустим проект.

Теперь у наших часов есть и аналоговый режим!



Скачать завершенный проект

Источник: КЛИК»
Категория: Создание игр | Добавил: NEBR (04 Ноября 2013) | Автор: Дмитрий NEBR Кичеев
Просмотров: 15863 | Комментарии: 8 | Рейтинг: 4.3/10 |
Теги: создать часы, DataTime, Clock, Time, время в Unity, уроки Unity на русском, часы в Unity
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «Часы в Unity3d.», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 8
+1-
7 beril   (05 Ноября 2013 21:34) [Материал]
berilО это уже посложней будет cool

+0-
8 NEBR   (09 Ноября 2013 20:30) [Материал]
NEBRтак классно смотрится, вот видос запилил http://www.youtube.com/watch?v=iIQQtKpjWX4

+1-
5 beril   (05 Ноября 2013 14:15) [Материал]
berilСпасибо за уроки.
Надеюсь на этом не остановишься smile

+0-
6 NEBR   (05 Ноября 2013 19:01) [Материал]
NEBRвсегда рад! ) Нет, потихоньку перевожу вот эту тему http://catlikecoding.com/unity/tutorials/graphs/

+0-
2 JHawk   (05 Ноября 2013 05:55) [Материал]
JHawkКопипаста, не приводишь своих коментариев к тои или иной строчке. Но для новичков самое то! happy

+1-
3 NEBR   (05 Ноября 2013 10:02) [Материал]
NEBRДа, своих строчек всего две ) Автор все очень подробно расписал, не видел необходимости в своих комментариях

+1-
1 Skmaestro   (05 Ноября 2013 03:12) [Материал]
Спасибо за пример
но думаю что это более сложная версия часов и есть способ по проще!

+1-
4 NEBR   (05 Ноября 2013 10:04) [Материал]
NEBRне за что ) Если делать проще - часы не будут показывать реальное время..

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск по сайту
10 случ. движков
  • Jo Engine
  • Aleph One
  • BatteryTech
  • PixelLight
  • Minko
  • URQ
  • GameLooper
  • Starling
  • GameGuru
  • Esenthel Engine
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    Все права сохранены. GcUp.ru © 2008-2024 Рейтинг