From 05753cc214d0c718af22a66c91b62292e3d71920 Mon Sep 17 00:00:00 2001 From: Michal Pikulski Date: Thu, 25 Sep 2025 12:02:18 +0200 Subject: [PATCH] Add a pause menu, auto load via bootstrap and correctly show depending on the current scene --- Assets/Art/Textures/MenuIcon_PLACEHOLDER.png | Bin 0 -> 6169 bytes .../Textures/MenuIcon_PLACEHOLDER.png.meta | 195 ++ .../Runtime/CustomBootSettings_Runtime.asset | 1 + .../LiberationSans SDF.asset | 399 ++- Assets/Prefabs/UI/PauseMenu.prefab | 2500 +++++++++++++++++ Assets/Prefabs/UI/PauseMenu.prefab.meta | 7 + .../Scenes/Levels/AppleHillsOverworld.unity | 32 + Assets/Scenes/Levels/Quarry.unity | 45 - Assets/Scripts/Input/InputManager.cs | 8 +- Assets/Scripts/UI/PauseMenu.cs | 142 + Assets/Scripts/UI/PauseMenu.cs.meta | 2 + 11 files changed, 3223 insertions(+), 108 deletions(-) create mode 100644 Assets/Art/Textures/MenuIcon_PLACEHOLDER.png create mode 100644 Assets/Art/Textures/MenuIcon_PLACEHOLDER.png.meta create mode 100644 Assets/Prefabs/UI/PauseMenu.prefab create mode 100644 Assets/Prefabs/UI/PauseMenu.prefab.meta create mode 100644 Assets/Scripts/UI/PauseMenu.cs create mode 100644 Assets/Scripts/UI/PauseMenu.cs.meta diff --git a/Assets/Art/Textures/MenuIcon_PLACEHOLDER.png b/Assets/Art/Textures/MenuIcon_PLACEHOLDER.png new file mode 100644 index 0000000000000000000000000000000000000000..21111f579defc3ab694173d631fab1a0fa53f108 GIT binary patch literal 6169 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 private void OnTapMovePerformed(InputAction.CallbackContext ctx) { + if (EventSystem.current.IsPointerOverGameObject()) + { + return; + } + Vector2 screenPos = positionAction.ReadValue(); Vector3 worldPos = Camera.main.ScreenToWorldPoint(screenPos); Vector2 worldPos2D = new Vector2(worldPos.x, worldPos.y); diff --git a/Assets/Scripts/UI/PauseMenu.cs b/Assets/Scripts/UI/PauseMenu.cs new file mode 100644 index 00000000..7b1f0efc --- /dev/null +++ b/Assets/Scripts/UI/PauseMenu.cs @@ -0,0 +1,142 @@ +using System; +using UnityEngine; +using UnityEngine.SceneManagement; +using Input; + +namespace UI +{ + public class PauseMenu : MonoBehaviour + { + [Header("UI References")] + [SerializeField] private GameObject pauseMenuPanel; + [SerializeField] private GameObject pauseButton; + + private void Start() + { + // Subscribe to scene loaded events + SceneManagerService.Instance.SceneLoadCompleted += SetPauseMenuByLevel; + + // Set initial state based on current scene + SetPauseMenuByLevel(SceneManager.GetActiveScene().name); + + // Initialize pause menu state + HidePauseMenu(); + } + + private void OnDestroy() + { + // Unsubscribe when destroyed + if (SceneManagerService.Instance != null) + { + SceneManagerService.Instance.SceneLoadCompleted -= SetPauseMenuByLevel; + } + } + + /// + /// Sets the pause menu game object active or inactive based on the current level + /// + /// The name of the level/scene + public void SetPauseMenuByLevel(string levelName) + { + if (string.IsNullOrEmpty(levelName)) + return; + + bool isMainMenu = levelName.ToLower().Contains("mainmenu"); + gameObject.SetActive(!isMainMenu); + + if(!isMainMenu) + HidePauseMenu(); // Ensure menu is hidden when switching to a game level + + Debug.Log($"[PauseMenu] Setting pause menu active: {!isMainMenu} for scene: {levelName}"); + } + + /// + /// Shows the pause menu and hides the pause button. Sets input mode to UI. + /// + public void ShowPauseMenu() + { + if (pauseMenuPanel != null) + pauseMenuPanel.SetActive(true); + + if (pauseButton != null) + pauseButton.SetActive(false); + + // Change input mode to UI when menu is open + InputManager.Instance.SetInputMode(InputMode.UI); + } + + /// + /// Hides the pause menu and shows the pause button. Sets input mode to Game. + /// + public void HidePauseMenu() + { + if (pauseMenuPanel != null) + pauseMenuPanel.SetActive(false); + + if (pauseButton != null) + pauseButton.SetActive(true); + + // Change input mode back to Game when menu is closed + InputManager.Instance.SetInputMode(InputMode.Game); + } + + /// + /// Resumes the game by hiding the pause menu. + /// + public void ResumeGame() + { + HidePauseMenu(); + } + + /// + /// Exits to the main menu scene. + /// + public async void ExitToMainMenu() + { + // Replace with the actual scene name as set in Build Settings + var progress = new Progress(p => Debug.Log($"Loading progress: {p * 100:F0}%")); + await SceneManagerService.Instance.SwitchSceneAsync("MainMenu", progress); + } + + /// + /// Exits the application. + /// + public void ExitGame() + { +#if UNITY_EDITOR + UnityEditor.EditorApplication.isPlaying = false; +#else + Application.Quit(); +#endif + } + + /// + /// Loads a level based on the selection from a dropdown menu. + /// Connect this to a Dropdown's onValueChanged event and pass the selected option text. + /// + /// The selected level name or identifier from the dropdown + public async void LoadLevel(int levelSelection) + { + // Hide the pause menu before loading a new level + HidePauseMenu(); + + // Replace with the actual scene name as set in Build Settings + var progress = new Progress(p => Debug.Log($"Loading progress: {p * 100:F0}%")); + switch (levelSelection) + { + case 0: + await SceneManagerService.Instance.SwitchSceneAsync("MainMenu", progress); + break; + case 1: + await SceneManagerService.Instance.SwitchSceneAsync("AppleHillsOverworld", progress); + break; + case 2: + await SceneManagerService.Instance.SwitchSceneAsync("Quarry", progress); + break; + case 3: + await SceneManagerService.Instance.SwitchSceneAsync("DivingForPictures", progress); + break; + } + } + } +} diff --git a/Assets/Scripts/UI/PauseMenu.cs.meta b/Assets/Scripts/UI/PauseMenu.cs.meta new file mode 100644 index 00000000..bfa85656 --- /dev/null +++ b/Assets/Scripts/UI/PauseMenu.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: cb36c2845dc855a4c980ef9dec6ca127 \ No newline at end of file