Danro/Assets/Scripts/UI/LoseBannerController.cs
Danil Iarosh b0a9b433c1
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
Added arcade machine hat blinking
- Добавил моргание шапки автомата, пока игра не началась
- Исправил баг, что при бесплатной игре для продолжения требовалась оплата
2026-01-22 09:59:17 +03:00

201 lines
6.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections;
using RR.Common.Managers;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using RR.Game2D.Core.Managers;
namespace RR.Common.UI
{
/// <summary>
/// Контроллер баннера проигрыша.
/// Модальное окно, которое отображается при поражении игрока.
/// </summary>
public class LoseBannerController : Modal
{
[Header("Элементы баннера проигрыша")]
[SerializeField] private TextMeshProUGUI loseText;
[SerializeField] private TextMeshProUGUI creditText;
[SerializeField] private Button continueButton;
[SerializeField] private TextMeshProUGUI continueButtonText;
[SerializeField] private float continueButtonCountdown = 30f;
[Header("Тексты")]
[SerializeField] private string creditTextFormat = "У вас осталось: {0}";
private PaymentManager _paymentManager;
private Coroutine _continueCountdownCoroutine;
/// <summary>
/// Событие, вызываемое при нажатии "Продолжить" или закрытии баннера.
/// </summary>
public event Action ContinueClicked;
protected override void Awake()
{
base.Awake();
if (continueButton)
{
continueButton.onClick.AddListener(OnContinueButtonClicked);
}
}
protected override void OnEnable()
{
base.OnEnable();
_paymentManager = GameManager.Instance?.Payment;
if (_paymentManager != null)
{
int credits = _paymentManager.CreditsCount;
if (creditText)
{
creditText.text = string.Format(creditTextFormat, credits);
}
_paymentManager.OnCreditAdded.AddListener(UnlockContinueButton);
}
}
protected override void OnDisable()
{
// Остановим корутину, если объект деактивируется
if (_continueCountdownCoroutine != null)
{
StopCoroutine(_continueCountdownCoroutine);
_continueCountdownCoroutine = null;
}
if (_paymentManager != null)
{
_paymentManager.OnCreditAdded.RemoveListener(UnlockContinueButton);
}
base.OnDisable();
}
/// <summary>
/// Показывает баннер проигрыша с указанным временем игры.
/// </summary>
/// <param name="gameTime">Время игры в секундах</param>
public void ShowLose(float gameTime)
{
if (loseText)
{
loseText.text = $"Время игры: {TimeFormatHelper.FormatTime(gameTime)}";
}
if (creditText && _paymentManager != null)
{
creditText.text = string.Format(creditTextFormat, _paymentManager.CreditsCount);
}
if (continueButtonCountdown <= 0f)
{
ContinueClicked?.Invoke();
GameManager.Instance?.SetPause(false);
GameManager.Instance?.LoadScene("MainMenu", false);
return;
}
if (continueButton)
{
continueButton.gameObject.SetActive(true);
continueButton.interactable = _paymentManager.IsFreePlayEnabled() || (_paymentManager != null && _paymentManager.CreditsCount > 0);
}
Open();
// Остановим предыдущую корутину, если есть
if (_continueCountdownCoroutine != null)
{
StopCoroutine(_continueCountdownCoroutine);
}
_continueCountdownCoroutine = StartCoroutine(ContinueCountdownCoroutine(continueButtonCountdown));
}
private IEnumerator ContinueCountdownCoroutine(float duration)
{
float elapsed = 0f;
int initialSeconds = Mathf.RoundToInt(duration);
UpdateContinueText(initialSeconds);
while (elapsed < duration)
{
float startTime = Time.unscaledTime;
yield return null;
while (Time.unscaledTime - startTime < 1.0f)
{
yield return null;
}
elapsed += 1f;
int remaining = Mathf.Max(0, Mathf.RoundToInt(duration - elapsed));
UpdateContinueText(remaining);
}
// Таймер истёк — закрываем баннер и выходим в меню
Close();
ContinueClicked?.Invoke();
if (GameManager.Instance)
{
GameManager.Instance.SetPause(false);
GameManager.Instance.LoadScene("MainMenu", false);
}
_continueCountdownCoroutine = null;
}
private void UpdateContinueText(int secondsRemaining)
{
if (continueButtonText)
{
continueButtonText.text = $"Продолжить? ({secondsRemaining})";
}
}
private void UnlockContinueButton(int newCredits)
{
if (_paymentManager == null) return;
if (_paymentManager.IsFreePlayEnabled() || SettingsManager.Instance.GetCurrentGameSettings().isFreeGame)
{
if (continueButton)
{
continueButton.interactable = true;
}
return;
}
if (continueButton)
{
continueButton.interactable = _paymentManager.CreditsCount > 0;
}
}
private void OnContinueButtonClicked()
{
// При клике на "Продолжить" — остановим таймер и продолжим игру
if (_continueCountdownCoroutine != null)
{
StopCoroutine(_continueCountdownCoroutine);
_continueCountdownCoroutine = null;
}
Close();
ContinueClicked?.Invoke();
if (GameManager.Instance)
{
GameManager.Instance.SetPause(false);
GameManager.Instance.ContinueGame();
}
}
}
}