Четверг, 21 Ноября 2024, 21:26

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
UniTimer
VigilemДата: Четверг, 24 Апреля 2014, 19:50 | Сообщение # 1
частый гость
Сейчас нет на сайте
Доброго времени суток, уважаемые форумчане smile
Недавно возникла задача, для реализации который необходим был таймер (если быть точным, то обратный отчёт). У каждой задачи есть решение, и эта из числа подобных задач. Поехали.
UniTimer

UPD: Добавлен вариант реализации таймера (более грамотный). Смотреть внизу поста. Предложил Strom54.

Первый вариант.

Второй вариант.


Всем удачи!:)


Сообщение отредактировал Vigilem - Пятница, 25 Апреля 2014, 10:13
Storm54Дата: Четверг, 24 Апреля 2014, 22:41 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Намного удобнее написать событие, на которое можно было бы подписаться. А вообще можно было бы юзнуть Invoke.

Сообщение отредактировал Storm54 - Четверг, 24 Апреля 2014, 22:44
VigilemДата: Четверг, 24 Апреля 2014, 23:16 | Сообщение # 3
частый гость
Сейчас нет на сайте
Цитата Storm54 ()
Намного удобнее написать событие, на которое можно было бы подписаться. А вообще можно было бы юзнуть Invoke.

С удовольствием посмотрел бы на Вашу реализацию, если такова имеется. Особенно реализация события smile
Storm54Дата: Пятница, 25 Апреля 2014, 00:28 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
Сейчас напишу

Добавлено (25.04.2014, 00:28)
---------------------------------------------
Вот мой аналог таймера:
Простота использования аналогична стандартному таймеру в C#
Сначала я хотел реализовать с использованием отдельных потоков, но из-за этого могли возникнуть проблемы, поэтому пришлось делать другим методом.
Создаем объект - пустышку и кидаем на него скрипт TimerManager - этот класс производит обновление всех активных таймеров. Стоит учесть, что скрипт делает объект не-уничтожаемым при переходе на другую сцену, так что на каждой сцене не нужно плодить лишних менеджеров, хотя и ошибок это не вызовет.

Ну а теперь дело за малым:

Код


void Start()
{
       SimpleTimer timer = new SimpleTimer(5);//Создаем объект. Вторым необязательным параметром можно указать, запускать ли таймер сразу при создании объекта.
       timer.OnTimer += new SimpleTimer.SimpleTimerEvent(TimerActivated); // Подписываемся на событие, которое кинет таймер.
       timer.Start(); // Запускаем таймер.
}

void TimerActivated(SimpleTimer timer)
{
       timer.OnTimer -= new SimpleTimer.SimpleTimerEvent(TimerActivated); // Желательно отписаться от события таймера. Хотя сделать это можно где-нибудь еще, например в OnDestroy

       Debug.Log("Timer activated !");
}



Сами классы:



Так что извините, конечно, но Ваш таймер никуда не годится. Больно уж неудобно его использовать.


Сообщение отредактировал Storm54 - Пятница, 25 Апреля 2014, 00:40
rakДата: Пятница, 25 Апреля 2014, 06:14 | Сообщение # 5
частый гость
Сейчас нет на сайте
Хоть тс и написал что знает про корутин, однако можно как то так
Код
using UnityEngine;
using System.Collections;

public class Timer : MonoBehaviour {

           public static IEnumerator Times(int count, float interval) {
                 while(count > 0){
                        DoSomething();
                        yield return new WaitForSeconds(interval);  
                        count--;
                 }
           }
}


Storm54Дата: Пятница, 25 Апреля 2014, 06:58 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Цитата rak ()
Хоть тс и написал что знает про корутин, однако можно как то так

Насколько я знаю, если наследовать класс от MonoBehaviour, то работать он будет только в качестве компонента на GameObject'е, в таком случае было бы слишком затратно, скажем, создать пару сотен таймеров.


Сообщение отредактировал Storm54 - Пятница, 25 Апреля 2014, 06:59
rakДата: Пятница, 25 Апреля 2014, 07:09 | Сообщение # 7
частый гость
Сейчас нет на сайте
Storm54, я просто писал создав скрипт в юнити. А так по сути я просто привел пример как можно сделать таймер. доработать и сделать его отдельным классом тож не составит труда)

Storm54Дата: Пятница, 25 Апреля 2014, 07:16 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
rak, короутины работают только в классах, наследованных от MonoBehaviour
rakДата: Пятница, 25 Апреля 2014, 07:24 | Сообщение # 9
частый гость
Сейчас нет на сайте
Storm54, А какая разница? Повесить его на один пустой ГО. А в коде создаешь новые объекты типа таймер да и все. Хотя конечно спорить прям сильно не буду) Еще раз повторюсь, это просто пример)



Сообщение отредактировал rak - Пятница, 25 Апреля 2014, 07:33
VigilemДата: Пятница, 25 Апреля 2014, 09:54 | Сообщение # 10
частый гость
Сейчас нет на сайте
Storm54, спасибо. С удовольствием посмотрел на Вашу реализацию. Изначально тоже была идея создания таймера по аналогии со стандартным таймером c#. Однако не хватило опыта, для реализации подписки на событие. Если не против, я вынесу Ваши классы и пример использования в шапку. Авось ещё кому пригодится.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг