using System.Collections; using UnityEngine; using UnityEngine.UI; using TMPro; using RR.Game2D.Core.Managers; using RR.Common.Managers; using RR.Common.Settings; namespace RR.Common.UI { public class MainMenu : MonoBehaviour { [Header("Кнопки")] [SerializeField] private Button newGameButton; [SerializeField] private Button quitButton; [Header("Автовыбор при загрузке")] [SerializeField] private Selectable defaultSelectable; [Tooltip("Задержка перед автовыбором элемента (сек)")] [SerializeField] private float selectDelay = 1f; [Header("Тексты")] [SerializeField] private TextMeshProUGUI paymentText; [SerializeField] private TextMeshProUGUI supportNumberText; [SerializeField] private TextMeshProUGUI superPrizeText; [Header("Форматы текстов")] [SerializeField] private string supportNumberFormat = "{0}"; [SerializeField] private string superPrizeFormat = "{0}"; private Managers.BalanceManager _balanceManager; private SettingsManager _settingsManager; private void Start() { _balanceManager = Managers.BalanceManager.Instance; _settingsManager = SettingsManager.Instance; Bootstrap(); if (Application.platform == RuntimePlatform.WebGLPlayer) { quitButton.gameObject.SetActive(false); } if (_balanceManager != null) _balanceManager.OnBalanceChanged.AddListener(OnBalanceChanged); if (_settingsManager != null) { _settingsManager.OnSettingsLoaded += OnSettingsChanged; _settingsManager.OnSettingsSaved += OnSettingsChanged; // Обновляем тексты сразу при старте UpdateTextsFromSettings(); } // Автовыбор элемента при загрузке сцены if (defaultSelectable != null) StartCoroutine(SelectAfterDelay()); } private IEnumerator SelectAfterDelay() { yield return new WaitForSeconds(selectDelay); if (defaultSelectable != null) defaultSelectable.Select(); } private void OnDestroy() { if (_balanceManager != null) _balanceManager.OnBalanceChanged.RemoveListener(OnBalanceChanged); if (_settingsManager != null) { _settingsManager.OnSettingsLoaded -= OnSettingsChanged; _settingsManager.OnSettingsSaved -= OnSettingsChanged; } } /// /// Метод для загрузки элементов сцены. /// Вешает события на кнопки /// private void Bootstrap() { if (newGameButton) { newGameButton.onClick.AddListener(OnNewGame); // Устанавливаем начальное состояние кнопки UpdatePlayButtonState(); } if (quitButton) quitButton.onClick.AddListener(OnQuit); } /// /// Метод начала новой игры /// private static void OnNewGame() { GameManager.Instance.NewGame(); } /// /// Метод выхода из игры /// private static void OnQuit() { Application.Quit(); } private void OnBalanceChanged(int balance) { UpdatePlayButtonState(); } private void OnSettingsChanged() { UpdatePlayButtonState(); UpdateTextsFromSettings(); } private void UpdateTextsFromSettings() { if (_settingsManager == null) return; // Обновляем номер поддержки if (supportNumberText != null) { string supportNumber = _settingsManager.GetString("payment.supportNumber"); supportNumberText.text = string.Format(supportNumberFormat, supportNumber); } // Обновляем описание суперприза if (superPrizeText != null) { bool showBigPrizeText = _settingsManager.GetBool("prizes.showBigPrizeText"); superPrizeText.gameObject.SetActive(showBigPrizeText); if (!showBigPrizeText) { return; } string superPrize = _settingsManager.GetString("prizes.bigPrize"); if (string.IsNullOrWhiteSpace(superPrize)) { PrizeSystemManager prizeSystemManager = PrizeSystemManager.Instance; if (prizeSystemManager != null) { superPrize = prizeSystemManager.GetPreferredQRCodePrizeText(); } } superPrizeText.text = string.Format(superPrizeFormat, superPrize); } } private void UpdatePlayButtonState() { if (!newGameButton) return; // Проверяем бесплатную игру if (_settingsManager != null && _settingsManager.GetBool("payment.freeGame")) { newGameButton.interactable = true; paymentText.gameObject.SetActive(false); return; } // Проверяем баланс через BalanceManager bool canStartGame = _balanceManager != null && _balanceManager.CanStartGame(); newGameButton.interactable = canStartGame; paymentText.gameObject.SetActive(!canStartGame); } } }