Danro/Assets/Scripts/UI/PauseMenu.cs
Danil Iarosh 3944534cd0
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
feat: Implement balance system and fix pause bug
- Добавлена система баланса игры (BalanceManager) для управления внутриигровой валютой
- Баланс начисляется за импульсы оплаты и списывается за начало/продолжение игры
- При старте игры весь внесенный баланс списывается, а жизни начисляются в соответствии с количеством оплат
- Добавлены проверки достаточности баланса для начала и продолжения игры
- Интегрирован BalanceManager с PaymentManager и GameManager
- Исправлен баг с возможностью снятия паузы при показе баннера проигрыша/победы
- Добавлена блокировка переключения паузы через IsActive флаг в PauseMenu
- Жизни больше не могут уйти в минус при повторной смерти во время показа баннера
- Настройки стоимости импульса, начала и продолжения игры берутся из SettingsManager
2026-02-09 11:31:34 +03:00

123 lines
4.5 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 UnityEngine;
using UnityEngine.UI;
using UnityEngine.InputSystem;
using RR.Game2D.Core.Managers;
namespace RR.Common.UI
{
/// <summary>
/// Меню паузы. Наследуется от Modal для автоматического управления фокусом.
/// Открывается/закрывается через GameManager.PauseStateChanged.
/// </summary>
public class PauseMenu : Modal
{
[Header("Управление паузой")]
[SerializeField] private InputActionReference pauseToggle;
[Header("Кнопки меню")]
[SerializeField] private Button resumeButton;
[SerializeField] private Button quitButton;
[Header("Связь с другими элементами")]
[SerializeField] private GameEndUIController bannerController;
/// <summary>
/// Флаг активности меню. Деактивируется когда показан баннер проигрыша/победы.
/// </summary>
public bool IsActive { get; private set; } = true;
protected override void Awake()
{
// Настраиваем обработчики кнопок
if (resumeButton) resumeButton.onClick.AddListener(OnResumeClicked);
if (quitButton) quitButton.onClick.AddListener(OnQuitClicked);
if (pauseToggle) pauseToggle.action.performed += OnPauseToggle;
// Устанавливаем первый выбранный элемент
SetFirstSelected(resumeButton);
if (GameManager.Instance != null)
GameManager.Instance.PauseStateChanged += HandlePauseChanged;
if (bannerController)
{
bannerController.WinBannerShown += _ => { IsActive = false; };
bannerController.LoseBannerShown += _ => { IsActive = false; };
bannerController.BannerDismissed += () => { IsActive = true; };
}
// Изначально скрыто - не вызываем base.Awake(), делаем это вручную
gameObject.SetActive(false);
}
private void OnPauseToggle(InputAction.CallbackContext ctx)
{
// Блокируем паузу если меню неактивно (например, показан баннер проигрыша/победы)
if (!IsActive) return;
GameManager.Instance.TogglePause();
}
private void OnDestroy()
{
if (pauseToggle) pauseToggle.action.performed -= OnPauseToggle;
if (GameManager.Instance != null)
GameManager.Instance.PauseStateChanged -= HandlePauseChanged;
}
/// <summary>
/// Обработка события паузы от GameManager.
/// </summary>
private void HandlePauseChanged(bool paused)
{
if (!IsActive) return;
if (paused)
Open();
else
Close();
}
/// <summary>
/// Переопределяем Close, чтобы при закрытии также снимать паузу.
/// </summary>
public override void Close()
{
// Блокируем закрытие если меню неактивно (показан баннер)
if (!IsActive) return;
base.Close();
// Если игра ещё на паузе, снимаем её
if (GameManager.Instance != null && GameManager.Instance.IsPaused)
{
GameManager.Instance.SetPause(false);
}
}
/// <summary>
/// Метод для возобновления игры.
/// </summary>
public static void OnResumeClicked()
{
// Блокируем если меню неактивно (показан баннер)
var pauseMenu = FindFirstObjectByType<PauseMenu>();
if (pauseMenu != null && !pauseMenu.IsActive) return;
GameManager.Instance.TogglePause();
}
/// <summary>
/// Метод для выхода в главное меню.
/// </summary>
public void OnQuitClicked()
{
GameManager.Instance.SetPause(false);
GameManager.Instance.LoadScene("MainMenu", false);
}
}
}