Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
- Добавлена система баланса игры (BalanceManager) для управления внутриигровой валютой - Баланс начисляется за импульсы оплаты и списывается за начало/продолжение игры - При старте игры весь внесенный баланс списывается, а жизни начисляются в соответствии с количеством оплат - Добавлены проверки достаточности баланса для начала и продолжения игры - Интегрирован BalanceManager с PaymentManager и GameManager - Исправлен баг с возможностью снятия паузы при показе баннера проигрыша/победы - Добавлена блокировка переключения паузы через IsActive флаг в PauseMenu - Жизни больше не могут уйти в минус при повторной смерти во время показа баннера - Настройки стоимости импульса, начала и продолжения игры берутся из SettingsManager
123 lines
4.5 KiB
C#
123 lines
4.5 KiB
C#
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);
|
||
}
|
||
}
|
||
} |