Files

155 lines
4.8 KiB
C#
Raw Permalink Normal View History

2026-07-08 19:53:15 +08:00
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<bool> cachedEscapeHandler;
private void Awake()
{
if (menuRoot == null) { menuRoot = gameObject; }
if (settingsController == null) { settingsController = FindObjectOfType<SettingsController>(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);
}
}
}
}