sega 826ff5782a Доработать игровые режимы, призы и настройки
Добавить таймеры и шкалы прогресса, расширить призовую систему и контроль остатков, восстановить настройки и обновить таблицу призов главного меню.
2026-09-14 10:47:25 +03:00

87 lines
2.2 KiB
C#

using System;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Serialization;
public class Timer : MonoBehaviour
{
public event Action TimerEnded;
public UnityEvent OnTimerEnded;
[FormerlySerializedAs("TimeLabel")] public TextMeshProUGUI timeLabel;
[SerializeField, FormerlySerializedAs("restTime")] private float _restTime;
[SerializeField] private AudioClip _warningSound;
private bool _processing;
private bool _recentlyPlayed;
private float _lastSignalTime;
private int _lastDisplayedSecond;
public float RemainingTime => _restTime;
public bool IsRunning => _processing;
private void Update()
{
if (_processing == false)
return;
_restTime -= Time.deltaTime;
if (_restTime <= 0f)
{
_restTime = 0f;
UiDraw();
StopTimer();
TimerEnded?.Invoke();
OnTimerEnded?.Invoke();
return;
}
UiDraw();
int rest = Mathf.CeilToInt(_restTime);
bool warningTime = rest > 0 && (rest % 60 == 0 || rest == 30 || rest < 11);
if (rest != _lastDisplayedSecond && _recentlyPlayed == false && warningTime)
{
if (_warningSound != null)
SoundManager.instance.PlaySfx(_warningSound);
_recentlyPlayed = true;
_lastSignalTime = Time.time;
}
_lastDisplayedSecond = rest;
if (_recentlyPlayed && Time.time - _lastSignalTime >= 1f)
_recentlyPlayed = false;
}
public void SetupTimer(float seconds)
{
_processing = false;
_restTime = Mathf.Max(seconds, 0f);
_recentlyPlayed = false;
_lastDisplayedSecond = Mathf.CeilToInt(_restTime);
UiDraw();
}
public void StartTimer()
=> _processing = true;
public void StopTimer()
=> _processing = false;
public void StopAndReset()
=> SetupTimer(0f);
private void UiDraw()
{
int totalSeconds = Mathf.CeilToInt(_restTime);
int minutes = totalSeconds / 60;
int seconds = totalSeconds % 60;
timeLabel.text = $"{minutes:00}:{seconds:00}";
}
}