155 lines
4.8 KiB
C#
155 lines
4.8 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|