using Boxes; using UnityEngine; using UnityEngine.SceneManagement; using TMPro; public class GameManager : MonoBehaviour { [Header("Ссылки на UI")] public TextMeshProUGUI timerText; public TextMeshProUGUI boxesText; public GameObject endGameScreen; public TextMeshProUGUI finalScoreText; private int _boxesCollected; private float _timeAlive; private bool _isPlaying = true; private int _scoreMultiplier = 1; public static GameManager Instance { get; private set; } void Awake() { if (Instance == null) Instance = this; else Destroy(gameObject); } private void OnEnable() { GameEvents.OnBoxCollected += OnBoxCollected; GameEvents.OnPlayerDied += EndGame; } private void OnDisable() { GameEvents.OnBoxCollected -= OnBoxCollected; GameEvents.OnPlayerDied -= EndGame; } void Start() { _scoreMultiplier = 1; _timeAlive = 0f; _isPlaying = true; _boxesCollected = 0; if (endGameScreen != null) endGameScreen.SetActive(false); Time.timeScale = 1f; UpdateUI(); } void Update() { if (!_isPlaying) return; _timeAlive += Time.deltaTime; UpdateUI(); } private void OnBoxCollected(BoxData boxData) { if (!_isPlaying) return; switch (boxData.effectType) { case BoxData.BoxEffectType.AddScore: int addAmount = (int)boxData.effectValue * _scoreMultiplier; for(int i = 0; i < addAmount; i++) { _boxesCollected++; GameEvents.OnBoxAddedToTruck?.Invoke(); } break; case BoxData.BoxEffectType.LoseScore: int loseAmount = (int)boxData.effectValue; for(int i = 0; i < loseAmount; i++) { if (_boxesCollected > 0) { _boxesCollected--; GameEvents.OnBoxLostFromTruck?.Invoke(); } } break; case BoxData.BoxEffectType.SpecialFurniture: Debug.Log("Собрана мебель!"); break; } UpdateUI(); } public void SetScoreMultiplier(int multiplier) { _scoreMultiplier = multiplier; } void UpdateUI() { if (timerText != null) { timerText.text = $"Время: {Mathf.FloorToInt(_timeAlive / 60):00}:{Mathf.FloorToInt(_timeAlive % 60):00}"; } if (boxesText != null) { boxesText.text = $"Собрано: {_boxesCollected}"; } } void EndGame() { if (!_isPlaying) return; _isPlaying = false; if (endGameScreen != null) endGameScreen.SetActive(true); if (finalScoreText != null) { finalScoreText.text = $"Вы собрали: {_boxesCollected} коробок!"; } } public void RestartGame() { SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); } }