Initial Unity project commit
This commit is contained in:
@@ -0,0 +1,154 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user