using System; using System.Collections; using UnityEngine; using UnityEngine.UI; using TMPro; using RR.Common.UI; using RR.Game2D.Core.Managers; using UnityEngine.EventSystems; public class LoseBannerController : MonoBehaviour { [SerializeField] private GameEndUIController bannersController; [Header("Кнопки")] [SerializeField] private TextMeshProUGUI loseText; [SerializeField] private Button continueButton; [SerializeField] private TextMeshProUGUI continueButtonText; [SerializeField] private float continueButtonCountdown = 10f; [SerializeField] private Button mainMenuButton; private Coroutine continueCountdownCoroutine; public event Action ContinueClicked; private void OnEnable() { bannersController.LoseBannerShown += OnLoseBannerShown; } private void OnDisable() { bannersController.LoseBannerShown -= OnLoseBannerShown; // Остановим корутину, если объект деактивируется if (continueCountdownCoroutine != null) { StopCoroutine(continueCountdownCoroutine); continueCountdownCoroutine = null; } } private void Awake() { if (continueButton) continueButton.onClick.AddListener(OnContinueClicked); // Инициализируем видимость/интерактивность кнопок в безопасное состояние if (continueButton) continueButton.gameObject.SetActive(false); if (continueButton && continueButtonText) continueButtonText.text = string.Empty; } private void OnLoseBannerShown(float gameTime) { // EventSystem.current.firstSelectedGameObject = continueButton.gameObject; EventSystem.current.SetSelectedGameObject(continueButton.gameObject); loseText.text = $"Время игры: {GameEndUIController.FormatTime(gameTime)}"; if (continueButtonCountdown <= 0f) { ContinueClicked?.Invoke(); GameManager.Instance.SetPause(false); GameManager.Instance.LoadScene("MainMenu", false); } if (continueButton) { continueButton.gameObject.SetActive(true); continueButton.interactable = true; } // // if (mainMenuButton) // mainMenuButton.gameObject.SetActive(false); // Остановим предыдущую корутину, если есть if (continueCountdownCoroutine != null) { StopCoroutine(continueCountdownCoroutine); continueCountdownCoroutine = null; } continueCountdownCoroutine = StartCoroutine(ContinueCountdownCoroutine(continueButtonCountdown)); } private IEnumerator ContinueCountdownCoroutine(float duration) { float elapsed = 0f; // Обновляем сразу первоначальный текст int initialSeconds = Mathf.RoundToInt(duration); UpdateContinueText(initialSeconds); while (elapsed < duration) { // Using yield return null and manual timing with unscaled time for more reliable updates float startTime = Time.unscaledTime; yield return null; // Wait for approximately 1 second using unscaled time while (Time.unscaledTime - startTime < 1.0f) { yield return null; } elapsed += 1f; int remaining = Mathf.Max(0, Mathf.RoundToInt(duration - elapsed)); UpdateContinueText(remaining); } if (continueButton) { ContinueClicked?.Invoke(); GameManager.Instance.SetPause(false); GameManager.Instance.LoadScene("MainMenu", false); } continueCountdownCoroutine = null; } private void UpdateContinueText(int secondsRemaining) { if (continueButtonText) continueButtonText.text = $"Продолжить? ({secondsRemaining})"; } private void OnContinueClicked() { // При клике на "Продолжить" — остановим таймер и продолжим игру if (continueCountdownCoroutine != null) { StopCoroutine(continueCountdownCoroutine); continueCountdownCoroutine = null; } ContinueClicked?.Invoke(); GameManager.Instance.SetPause(false); GameManager.Instance.ContinueGame(); } }