using System.Collections; using UnityEngine; using UnityEngine.UI; using UnityEngine.InputSystem; using RR.Game2D.Core.Managers; namespace RR.Common.UI { public class PauseMenu : MonoBehaviour { [Header("Управление")] [SerializeField] private InputActionReference close; [Header("UI")] [SerializeField] private CanvasGroup panel; [SerializeField] private Button resumeButton; [SerializeField] private Button quitButton; [Header("Связь с другими элементами")] [SerializeField] private GameEndUIController bannerController; //[SerializeField] private Button restartButton; //[SerializeField] private KeyCode toggleKey = KeyCode.Escape; // Esc private bool isActive = true; private void OnEnable() { if (GameManager.Instance != null) GameManager.Instance.PauseStateChanged += HandlePauseChanged; bannerController.WinBannerShown += (f) => { isActive = false; }; bannerController.LoseBannerShown += (f) => { isActive = false; }; bannerController.BannerDismissed += () => { isActive = true; }; } private void OnDisable() { if (GameManager.Instance != null) GameManager.Instance.PauseStateChanged -= HandlePauseChanged; } private void Awake() { if (resumeButton) resumeButton.onClick.AddListener(OnResumeClicked); if (quitButton) quitButton.onClick.AddListener(OnQuitClicked); //if (restartButton) restartButton.onClick.AddListener(OnRestartClicked); // Изначально скрыто SetVisible(false, instant: true); } private void Update() { if (close.action.WasPressedThisFrame()) GameManager.Instance.TogglePause(); } /// /// Обработка события паузы /// /// Ставить ли на паузу private void HandlePauseChanged(bool paused) { if (!isActive) return; SetVisible(paused); } /// /// Метод для изменения отображения /// /// Отображать ли меню паузы /// Постоянно или нет private void SetVisible(bool visible, bool instant = false) { if (!panel) return; panel.interactable = visible; panel.blocksRaycasts = visible; if (instant) { panel.alpha = visible ? 1f : 0f; } else { StopAllCoroutines(); StartCoroutine(Fade(panel, visible ? 1f : 0f, 0.15f)); } } /// /// Метод для плавного изменения видимости /// /// Группа холстов /// Целевое значение альфа-канала /// Продолжительность перехода private IEnumerator Fade(CanvasGroup cg, float target, float duration) { float start = cg.alpha; float t = 0f; while (t < duration) { t += Time.unscaledDeltaTime; cg.alpha = Mathf.Lerp(start, target, t / duration); yield return null; } cg.alpha = target; } /// /// Метод для возобновления игры /// public void OnResumeClicked() => GameManager.Instance.SetPause(false); //public void OnRestartClicked() //{ // GameManager.Instance.SetPause(false); // GameManager.Instance.ResetLevel(); //} /// /// Метод для выхода в главное меню /// public void OnQuitClicked() { GameManager.Instance.SetPause(false); GameManager.Instance.LoadScene("MainMenu", false); } } }