Создание простого таймера в Unity
Приветствую начинающих разработчиков игр. В данной статье мы научимся создавать простой таймер, который будет иметь функции старта, паузы, и остановки таймера. Управляться таймер будет в ручном режиме, с помощью соответствующих кнопок.
Для начала создадим три кнопки с помощью окна Hierarchy, выбрав UI — Button — TextMeshPro. Так же создадим и текстовое поле, в котором будет отображаться время нашего таймера: UI — Text — TextMeshPro.
Текст для трёх кнопок укажем следующий: «Старт», «Пауза», «Стоп». А для текстового поля просто укажем 0. Выглядеть это будет примерно так:
Чтобы наши кнопки умели запускать и останавливать таймер, необходимо для них написать соответствующие функции. Для этого с помощью окна Project создадим C# скрипт, и дадим ему название, например, Timer. Этот скрипт присвойте любому игровому объекту, например вашей камере, или канвасу.
using UnityEngine; using TMPro; public class Timer : MonoBehaviour < public float time = 0; public bool start = false; public TextMeshProUGUI value; public void StartTimer() < start = true; >public void PauseTimer() < start = false; >public void StopTimer() < start = false; time = 0; value.text = time.ToString("0.00"); >void Update() < if (start == true) < time += Time.deltaTime; value.text = time.ToString("0.00"); >> >
Обратите внимание, что во второй строчке мы подключили TMPro, поскольку мы работаем с UI элементами типа TMPro.
В строке #6-8 мы объявили три переменные:
- time хранит время самого таймера.
- start — хранит информацию о том, запущен ли таймер или остановлен.
- value — хранит ссылку на UI элемент Text — TextMeshPro. Не забудьте перетащить данный объект из окна Hierarchy в поле value скрипта Timer, окна Inspector.
Далее мы создали три функции для наших кнопок:
- StartTimer() — функция для запуска таймера.
- PauseTimer() — функция для паузы таймера.
- StopTimer() — функция для полной остановки таймера, и сбрасывания значение таймера до нуля.
Ну и в функции Update() мы проверяем, если таймер запущен, то увеличиваем значение time, и выводим это значение на экран, предварительно преобразовав числовое значение time в строковое, с помощью метода ToString.
Вся основная работа сделана. Осталось прикрепить к нашим кнопкам, наши функции из скрипта. Для этого сделаем 2 простых действия:
- Нажмём на нашу кнопку с текстом «Старт», и в инспекторе в поле On Click() перетащим наш объект, на котором имеется наш скрипт Timer. В моём случаем это объект Canvas.
- Нажмём на No Function, и выберем там Timer — StartTimer().
Такие же действия проделаем и с кнопками «Пауза» и «Стоп», присвоив им оставшиеся функции: Timer — PauseTimer() и Timer — StopTimer().
Таймер готов! Данный таймер можно переделать таким образом, чтобы он работал не на увеличение значения таймера, а на уменьшение. Принцип такого таймера впринципе такой же.
Если Вам данная статья была полезна, буду рад вашим лайкам и комментариям 🙂
Таймер
Таймер — простая программа-таймер, проигрывающая сигнал через установленное пользователем время.
Автор обзора : Алексей Астафьев, 28.11.2014
Скриншоты и видео:
Windows XP
Windows Vista
Русский , Английский
Новые отзывы о Таймер
Отзыв #2832 от GloryRod | Смотреть отзыв отдельно
Достоинства
— Не нужно устанавливать.
— Громкий сигнал. Сразу хочется его отключить
Недостатки
— Сигнал отключается только при нажатии кнопки в окне. Если утилита свернута (а она при этом улезает в трей), то ее еще нужно оттуда достать.
— Всего один режим работы таймера.
— Нельзя поменять сигнал таймера.
Итоги и комментарии
Микропрограммка Таймер выполняет всего одну вещь – проигрывает громкий неприятный сигнал после истечения заданного времени. Это программный аналог будильника на плите Больше ничего не умеет и учиться, похоже, не желает.
Зато орет громко!
Сам пользоваться не буду, но вдруг кому пригодится
Наборы c этой программой
Таймеры и секундомеры. По окончании установленного отрезка времени возможно выполнение различных операций.
Таймеры в Unity
Мне в одном классе нужно реализовать два таймера: первый бесконечно (или пока сцена с игрой не будет закрыто) должен каждые m секунд выполнять действие (1), второй каждые n секунд действие (2). Нужно учитывать то, что есть в игре пауза, и при её вызове нужно таймеры на паузу ставить (я бы мог сделать через корутины, но не знаю как их ставить на паузу). Как это можно реализовать?
Отслеживать
задан 17 дек 2016 в 18:05
Nikita Medvedev Nikita Medvedev
103 1 1 серебряный знак 8 8 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Самый банальный способ это иметь флаг, который устанавливается true/false когда игра активна/на паузе. В зависимости от этого флага уже танцевать в корутине.
using UnityEngine; using System.Collections; public class TimerTest : MonoBehaviour < public bool isGameStopped = false; private int timer = 0; IEnumerator WaitAndPrint() < while(true) < if (!isGameStopped) < Debug.Log("TimerCount: " + (timer++)); yield return new WaitForSeconds(1); >yield return null; > > void Start() < StartCoroutine(WaitAndPrint()); >>
Естественно isGameStopped скорее всего будет не в самом этом классе. Но это уже вам решать где его делать и в какой момент и каким способом его менять.
Смысл тут в том, что если флаг false , то будет простой банальный выход из корутины yield return null; . В ином же случае будет заход в if (!isGameStopped) и срабатывание счетчика.
Еще вариант — стартовать и останавливать корутину при возникновении какого-либо события (паузы)
using UnityEngine; using System.Collections; public class TimerTest : MonoBehaviour < public bool isGameStopped = false; private int timer = 0; private IEnumerator coroutine; IEnumerator WaitAndPrint() < while(true) < Debug.Log("TimerCount: " + (timer++)); yield return new WaitForSeconds(1); >> void Start() < coroutine = WaitAndPrint(); >void Update() < if (Input.GetMouseButtonDown(0)) StartCoroutine(coroutine); if (Input.GetKeyDown("space"))< StopCoroutine(coroutine); >> >
В данном случае корутина запускается нажатием левой клавиши мыши, а останавливается нажатием на пробел. Но привязать это поведение к паузе, думаю сможете сами.
using UnityEngine; using System.Collections; public class TimerTest : MonoBehaviour < public bool isGameStopped = false; private float timer = 0.0f; private float timeDelta = 0.0f; private IEnumerator coroutine; IEnumerator WaitAndPrint() < while(true) < timer = Time.time - timeDelta; yield return null; >> void Start() < coroutine = WaitAndPrint(); StartCoroutine(coroutine); >void Update() < if (Input.GetMouseButtonDown(0)) < timeDelta = Time.time - timer; StartCoroutine(coroutine); >if (Input.GetKeyDown("space")) < StopCoroutine(coroutine); timeDelta = 0; >> >
Time.time — время с начала игры. timeDelta — вычисляется когда запускается корутина, и обнуляется, когда останавливается.
Вообще, зависит от того, каким образом происходит пауза в игре.
Например, в некоторых случаях программисты делают паузу делая значение глобального времени Time.timeScale равным нулю. Тогда всё останавливается. В том числе и время Time.time . Если Time.timeScale равно единице, то это полная игровая скорость.
Соответственно, если пауза делается именно через timeScale , то, в принципе, достаточно отслеживать Time.time , который будет показывать нужное время. А если пауза делается другими способами, но Time.time неизменно течет, то тогда делать примерно как описано в коде выше.
Таймер на 1 час в Unity3D
Привет! Помогите создать таймер на 1 час в юнити; нужно что бы через каждый час происходило действие.
int aTimer = Time.deltaTime; if(aTimer >= 3600)/выполняем действие и обнуляем таймер aTimer =0;>
Отслеживать
171 12 12 бронзовых знаков
задан 1 авг 2017 в 13:15
845 8 8 серебряных знаков 24 24 бронзовых знака
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
float aTimer=3600f; void Update() < if(aTimer <=0f) < //действие aTimer =3600f; >else aTimer -= Time.deltaTime;//Time.unscaledDeltaTime >
void Start() < StartCoroutine(OneHour()); >IEnumerator OneHour() < YieldInstruction yi = new WaitForSeconds(3600f); while (true) < yield return yi; //действие >>
Отслеживать
ответ дан 1 авг 2017 в 13:30
1,610 2 2 золотых знака 9 9 серебряных знаков 13 13 бронзовых знаков
Очень простой вариант спасибо большое, у меня не получалось(
1 авг 2017 в 13:36
- c#
- unity3d
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.30.8420