using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; using Polyart; using TMPro; public class InGameMenu : MonoBehaviour { [Header("Menu UI")] public GameObject menuPanel; public Button resumeButton; public Button mainMenuButton; public Slider volumeSlider; public TextMeshProUGUI volumeValueText; [Header("Settings")] public KeyCode menuKey = KeyCode.Escape; public string mainMenuSceneName = "MainMenu"; private bool isMenuOpen = false; private AudioManager audioManager; private FirstPersonController_Polyart playerController; void Start() { // Find references audioManager = FindFirstObjectByType(); playerController = FirstPersonController_Polyart.instance; // Initialize menu state if (menuPanel != null) menuPanel.SetActive(false); // Setup UI events if (resumeButton != null) resumeButton.onClick.AddListener(ResumeGame); if (mainMenuButton != null) mainMenuButton.onClick.AddListener(ReturnToMainMenu); if (volumeSlider != null) { // Initialize volume slider with current volume float currentVolume = PlayerPrefs.GetFloat("MusicVolume", 1f); volumeSlider.value = currentVolume; volumeSlider.onValueChanged.AddListener(OnVolumeChanged); UpdateVolumeText(currentVolume); } } void Update() { // Check for menu toggle input if (Input.GetKeyDown(menuKey)) { ToggleMenu(); } } public void ToggleMenu() { isMenuOpen = !isMenuOpen; if (menuPanel != null) menuPanel.SetActive(isMenuOpen); // Control game state if (isMenuOpen) { OpenMenu(); } else { CloseMenu(); } } private void OpenMenu() { // Pause game Time.timeScale = 0f; // Enable cursor Cursor.lockState = CursorLockMode.None; Cursor.visible = true; // Disable player movement if (playerController != null) playerController.SetCanMove(false); // Enable menu panel if (menuPanel != null) menuPanel.SetActive(true); } private void CloseMenu() { // Resume game Time.timeScale = 1f; // Disable cursor Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; // Enable player movement if (playerController != null) playerController.SetCanMove(true); // Disable menu panel if (menuPanel != null) menuPanel.SetActive(false); } public void ResumeGame() { if (isMenuOpen) { ToggleMenu(); } } public void ReturnToMainMenu() { // Resume time scale before loading new scene Time.timeScale = 1f; // Load main menu scene if (LoadingScene.Instance != null) { LoadingScene.Instance.FadeAndLoad(mainMenuSceneName); } else { SceneManager.LoadScene(mainMenuSceneName); } } private void OnVolumeChanged(float value) { // Update audio manager volume if (audioManager != null) { audioManager.SetVolume(value); } else { // Fallback: directly save to PlayerPrefs PlayerPrefs.SetFloat("MusicVolume", value); // Try to find and update any audio sources with music AudioSource[] audioSources = FindObjectsByType(FindObjectsSortMode.None); foreach (AudioSource source in audioSources) { if (source.gameObject.name.ToLower().Contains("music") || source.gameObject.name.ToLower().Contains("background")) { source.volume = value; } } } UpdateVolumeText(value); } private void UpdateVolumeText(float value) { if (volumeValueText != null) { volumeValueText.text = Mathf.RoundToInt(value * 100) + "%"; } } // Public method to open menu from other scripts public void OpenMenuExternal() { if (!isMenuOpen) { ToggleMenu(); } } // Public method to close menu from other scripts public void CloseMenuExternal() { if (isMenuOpen) { ToggleMenu(); } } void OnDestroy() { // Ensure time scale is reset when this object is destroyed Time.timeScale = 1f; } }