107 lines
3.7 KiB
C#
107 lines
3.7 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;
|
||
|
||
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);
|
||
}
|
||
}
|
||
} |