using UnityEngine; using UnityEngine.UI; using UnityEngine.InputSystem; using RR.Game2D.Core.Managers; namespace RR.Common.UI { /// /// Меню паузы. Наследуется от Modal для автоматического управления фокусом. /// Открывается/закрывается через GameManager.PauseStateChanged. /// 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; } /// /// Обработка события паузы от GameManager. /// private void HandlePauseChanged(bool paused) { if (!_isActive) return; if (paused) Open(); else Close(); } /// /// Переопределяем Close, чтобы при закрытии также снимать паузу. /// public override void Close() { base.Close(); // Если игра ещё на паузе, снимаем её if (GameManager.Instance != null && GameManager.Instance.IsPaused) { GameManager.Instance.SetPause(false); } } /// /// Метод для возобновления игры. /// public static void OnResumeClicked() => GameManager.Instance.TogglePause(); /// /// Метод для выхода в главное меню. /// public void OnQuitClicked() { GameManager.Instance.SetPause(false); GameManager.Instance.LoadScene("MainMenu", false); } } }