using Core.InputLock; using Core.SaveSystem; using Michsky.UI.Reach; using UI.PanelStack; using UI.Settings; using System.Collections; using UnityEngine; using UnityEngine.SceneManagement; namespace UI.PauseMenu { public class InGamePauseMenuController : MonoBehaviour { [SerializeField] private bool debugLogs = true; [Header("Root")] [SerializeField] private GameObject menuRoot; [Header("Buttons")] [SerializeField] private ButtonManager saveAndExitButton; [SerializeField] private ButtonManager settingsButton; [SerializeField] private ButtonManager returnToGameButton; [Header("Settings Panel")] [SerializeField] private SettingsController settingsController; [Header("Exit")] [SerializeField] private int titleSceneBuildIndex = 1; private bool isWired; private bool handlerRegistered; private System.Func cachedEscapeHandler; private void Awake() { if (menuRoot == null) { menuRoot = gameObject; } if (settingsController == null) { settingsController = FindObjectOfType(true); } WireOnce(); menuRoot.SetActive(false); if (cachedEscapeHandler == null) { cachedEscapeHandler = TryOpenFromEscape; } if (debugLogs) Debug.Log($"[InGamePause] Awake. menuRoot={menuRoot.name} settingsController={(settingsController!=null)}"); } private void OnEnable() { StartCoroutine(RegisterEscapeHandlerWhenReady()); } private void OnDisable() { if (UIPanelStack.Instance != null) { UIPanelStack.Instance.ClearEscapeOpenHandler(cachedEscapeHandler); } handlerRegistered = false; } private IEnumerator RegisterEscapeHandlerWhenReady() { while (enabled && gameObject.activeInHierarchy && UIPanelStack.Instance == null) { yield return null; } if (!enabled || !gameObject.activeInHierarchy) { yield break; } if (UIPanelStack.Instance == null) { yield break; } if (handlerRegistered) { yield break; } UIPanelStack.Instance.SetEscapeOpenHandler(cachedEscapeHandler); handlerRegistered = true; if (debugLogs) Debug.Log("[InGamePause] Escape handler registered."); } private bool TryOpenFromEscape() { if (menuRoot == null) { return false; } if (menuRoot.activeInHierarchy) { return false; } if (debugLogs) Debug.Log("[InGamePause] TryOpenFromEscape -> Open()"); Open(); return true; } public void Open() { if (menuRoot == null) { return; } if (menuRoot.activeInHierarchy) { return; } menuRoot.SetActive(true); if (debugLogs) Debug.Log("[InGamePause] Open."); if (UIPanelStack.Instance != null) { UIPanelStack.Instance.Push(UIPanelKind.Pause, menuRoot, Close); } if (PlayerControlLockService.Instance != null) { PlayerControlLockService.Instance.Lock(this); } } public void Close() { if (menuRoot == null) { return; } if (UIPanelStack.Instance != null) { UIPanelStack.Instance.Remove(menuRoot); } menuRoot.SetActive(false); if (debugLogs) Debug.Log("[InGamePause] Close."); if (PlayerControlLockService.Instance != null) { PlayerControlLockService.Instance.Unlock(this); } } private void WireOnce() { if (isWired) { return; } if (saveAndExitButton != null) { saveAndExitButton.onClick.AddListener(OnSaveAndExitClicked); } if (settingsButton != null) { settingsButton.onClick.AddListener(OnSettingsClicked); } if (returnToGameButton != null) { returnToGameButton.onClick.AddListener(Close); } isWired = true; } private void OnSettingsClicked() { if (debugLogs) Debug.Log($"[InGamePause] Settings clicked. settingsController={(settingsController!=null)}"); if (settingsController != null) { settingsController.OpenAtIndex(0); } } private void OnSaveAndExitClicked() { if (SaveManager.Instance != null) { SaveManager.Instance.SaveGame(); } Close(); if (titleSceneBuildIndex >= 0 && titleSceneBuildIndex < SceneManager.sceneCountInBuildSettings) { SceneManager.LoadSceneAsync(titleSceneBuildIndex); } } } }