Danro/Assets/Scripts/UI/PauseMenu.cs

107 lines
3.7 KiB
C#
Raw Permalink 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;
private bool _isActive = 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)
{
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()
{
base.Close();
// Если игра ещё на паузе, снимаем её
if (GameManager.Instance != null && GameManager.Instance.IsPaused)
{
GameManager.Instance.SetPause(false);
}
}
/// <summary>
/// Метод для возобновления игры.
/// </summary>
public static void OnResumeClicked() => GameManager.Instance.TogglePause();
/// <summary>
/// Метод для выхода в главное меню.
/// </summary>
public void OnQuitClicked()
{
GameManager.Instance.SetPause(false);
GameManager.Instance.LoadScene("MainMenu", false);
}
}
}