Как сделать таймер отсчета?

169
05 декабря 2019, 07:40

Нажимается кнопка в игре, происходит действие и начинается отсчет (допустим 10 секунд), bool становится false. После прохождения таймера в 10с, значение bool изменяется на true. Можно снова активировать кнопку.

Answer 1
public class TimedButton : MonoBehaviour
{
    public float cooldownTime = 1f;
    bool ready = true;
    void Update(){
        if(/*кнопка нажалась*/ && ready){           
            StartCoroutine(CooldownHandler())
        }
    }
    IEnumerator CooldownHandler()
    {
        ready = false;
        yield return new WaitForSeconds(cooldownTime);
        ready = true;
    }
}
Answer 2
Перед тем как читать этот ответ, стоит написать что ответ RiotBr3aker хорош и оптимален для большинства ситуаций :) Альтернативный путь 1:

Если не требуется отображение времени, можно использовать DelayedCall при помощи внешних библиотек. Например в LeanTween:

//через 5 секунд вызвать код
LeanTweed.DeayedCall(5f, ()=>{ /*некий код*/});

Ассет:

https://assetstore.unity.com/packages/tools/animation/leantween-3595

И документация:

http://dentedpixel.com/LeanTweenDocumentation/classes/LeanTween.html#method_LeanTween.delayedCall

Альтернативный путь 2:

Мой ответ -- это просто еще один вариант на тему. Использовать в юнити должно быть аналогично даному примеру. Так же в юнити можно написать и аналогичный класс который будет работать более точно на основе Update() и Time.DeltaTime.

Но чаще, все же, используется подход написанный RiotBr3aker т.к. это банально проще.

пример CountDownTimer-а на форме:

.

Использование:

CountDownTimer timer = new CountDownTimer();//создаем инстанс
timer.SetTime(30,0); //выставляем на 30 минут
timer.StepMs = 33; //Выставляем шаг таймера (как часто вызывается TimeChanged)
//Подписываемся на событие TimeChanged и в нем обновляем значение лейбла
timer.TimeChanged += () => Label1.Text = timer.TimeLeftMsStr; 
// Подписываемся на событие окончания таймера и реагируем на него сообщухой
timer.CountDownFinished += () => MessageBox.Show("Timer finished the work!"); 
timer.Start(); //стартуем

И не забываем вызвать Dispose(); когда таймер уже не нужен

Код таймера:

using System;
public class CountDownTimer : IDisposable
{
    public Action TimeChanged;
    public Action CountDownFinished;
    public bool IsRunnign => timer.Enabled;
    public int StepMs
    {
        get => timer.Interval;
        set => timer.Interval = value;
    }
    private Timer timer = new Timer();
    private DateTime _maxTime = new DateTime(1, 1, 1, 0, 30, 0);
    private DateTime _minTime = new DateTime(1, 1, 1, 0, 0, 0);
    public DateTime TimeLeft { get; private set; }
    private long TimeLeftMs => TimeLeft.Ticks / TimeSpan.TicksPerMillisecond;
    public string TimeLeftStr => TimeLeft.ToString("mm:ss");
    public string TimeLeftMsStr => TimeLeft.ToString("mm:ss.fff");
    private void TimerTick(object sender, EventArgs e)
    {
        if (TimeLeftMs > timer.Interval)
        {
            TimeLeft = TimeLeft.AddMilliseconds(-timer.Interval);
            TimeChanged?.Invoke();
        }
        else
        {
            Stop();
            TimeLeft = _minTime;
            TimeChanged?.Invoke();
            CountDownFinished?.Invoke();
        }
    }
    public CountDownTimer(int min, int sec)
    {
        SetTime(min, sec);
        Init();
    }
    public CountDownTimer(DateTime dt)
    {
        SetTime(dt);
        Init();
    }
    public CountDownTimer()
    {
        Init();
    }
    private void Init()
    {
        TimeLeft = _maxTime;
        StepMs = 1000;
        timer.Tick += new EventHandler(TimerTick);
    }
    public void SetTime(DateTime dt) {
        TimeLeft = _maxTime = dt;
        TimeChanged?.Invoke();
    }
    public void SetTime(int min, int sec=0) => SetTime(new DateTime(1, 1, 1, 0, min, sec));
    public void Start() => timer.Start();
    public void Pause() => timer.Stop();
    public void Stop()
    {
        Pause();
        Reset();
    }
    public void Reset()
    {
        TimeLeft = _maxTime;
    }
    public void Restart()
    {
        Reset();
        Start();
    }
    public  void Dispose() => timer.Dispose();
}
READ ALSO
Отмена изменений объекта MVVM WPF EF6

Отмена изменений объекта MVVM WPF EF6

У меня есть проект для моего колледжаВ нем я пытаюсь реализовать MVVM + WPF + EF6

125
Данные из базы данных в txt файл

Данные из базы данных в txt файл

Всем привет! Есть веб приложение с базой студентов (id, Имя, возраст, сумма баллов) Хочу сделать выборку из базы 5 студентов с самыми высокими...

151
Локализация через ResX Resource Manager

Локализация через ResX Resource Manager

В ResX Resource Manager создал переводы всех строк (Neutral,en,ru,ru-RU)Git показал, что файлы добавились

121
Как selenium webdriver отлавливать реквесты с сайта

Как selenium webdriver отлавливать реквесты с сайта

может кто-то сталкивался с подобным тестированием и может помочь

158