Danro/Assets/Scripts/UI/LoseBannerController.cs
Danil Iarosh 2f2d100eae feat(inputs): remove obsolete COM input system and update dependencies
- Removed deprecated ButtonPinMapping enum and related COM input classes- Updated ComInputToInputSystemAdapter with improved binding logic- Refactored GameManager to use new globals prefab path
- Enhanced GameEndUIController with event system focus management
- Modified Globals prefab to use pin-based input bindings
- Cleaned up obsolete COM system wrapper and native wrapper classes
- Adjusted input adapter to support pin bindings over action bindings
- Updated manufacturer name in virtual gamepad description
2025-11-04 17:06:51 +03:00

139 lines
4.6 KiB
C#

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();
}
}