using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; using UnityEngine.InputSystem; public class PauseMenu : MonoBehaviour { [Header("Панели")] public GameObject pauseMenuPanel; public GameObject settingsPanel; [Header("Настройки: Звук")] public Slider volumeSlider; public Text volumeValueText; public Toggle muteToggle; [Header("Настройки: Графика")] public Dropdown qualityDropdown; public Toggle fullscreenToggle; [Header("Настройки: Управление")] public Slider sensitivitySlider; public Text sensitivityValueText; private bool isPaused = false; private bool isInitializing = false; public bool IsPaused => isPaused; private void Start() { if (pauseMenuPanel != null) pauseMenuPanel.SetActive(false); if (settingsPanel != null) settingsPanel.SetActive(false); InitializeSettingsUI(); } private void Update() { var keyboard = Keyboard.current; if (keyboard != null && keyboard.escapeKey.wasPressedThisFrame) { if (isPaused) { if (settingsPanel != null && settingsPanel.activeSelf) { CloseSettings(); } else { ResumeGame(); } } else { PauseGame(); } } } public void PauseGame() { isPaused = true; Time.timeScale = 0f; Cursor.lockState = CursorLockMode.None; Cursor.visible = true; if (pauseMenuPanel != null) pauseMenuPanel.SetActive(true); if (settingsPanel != null) settingsPanel.SetActive(false); } public void ResumeGame() { isPaused = false; Time.timeScale = 1f; Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; if (pauseMenuPanel != null) pauseMenuPanel.SetActive(false); if (settingsPanel != null) settingsPanel.SetActive(false); } public void OpenSettings() { if (pauseMenuPanel != null) pauseMenuPanel.SetActive(false); if (settingsPanel != null) settingsPanel.SetActive(true); } public void CloseSettings() { PlayerPrefs.Save(); if (settingsPanel != null) settingsPanel.SetActive(false); if (pauseMenuPanel != null) pauseMenuPanel.SetActive(true); } public void ReturnToMainMenu() { Time.timeScale = 1f; Cursor.lockState = CursorLockMode.None; Cursor.visible = true; SceneManager.LoadScene("MainMenu"); } public void QuitGame() { PlayerPrefs.Save(); Application.Quit(); #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false; #endif } private void InitializeSettingsUI() { isInitializing = true; // Звук float savedVolume = PlayerPrefs.GetFloat(GameSettings.KeyMasterVolume, 1.0f); bool savedMute = PlayerPrefs.GetInt(GameSettings.KeyIsMuted, 0) == 1; if (volumeSlider != null) { volumeSlider.minValue = 0f; volumeSlider.maxValue = 1f; volumeSlider.value = savedVolume; volumeSlider.onValueChanged.AddListener(OnVolumeChanged); } if (muteToggle != null) { muteToggle.isOn = savedMute; muteToggle.onValueChanged.AddListener(OnMuteChanged); } UpdateVolumeLabel(savedVolume, savedMute); // Качество графики if (qualityDropdown != null) { qualityDropdown.ClearOptions(); List options = new List(); foreach (var q in QualitySettings.names) { options.Add(TranslateQuality(q)); } qualityDropdown.AddOptions(options); qualityDropdown.value = PlayerPrefs.GetInt(GameSettings.KeyQualityLevel, QualitySettings.GetQualityLevel()); qualityDropdown.RefreshShownValue(); qualityDropdown.onValueChanged.AddListener(OnQualityChanged); } // Полноэкранный режим if (fullscreenToggle != null) { fullscreenToggle.isOn = PlayerPrefs.GetInt(GameSettings.KeyFullscreen, Screen.fullScreen ? 1 : 0) == 1; fullscreenToggle.onValueChanged.AddListener(OnFullscreenChanged); } // Чувствительность float savedSens = PlayerPrefs.GetFloat(GameSettings.KeyMouseSensitivity, 1.0f); if (sensitivitySlider != null) { sensitivitySlider.minValue = 0.2f; sensitivitySlider.maxValue = 3.0f; sensitivitySlider.value = savedSens; sensitivitySlider.onValueChanged.AddListener(OnSensitivityChanged); } UpdateSensitivityLabel(savedSens); isInitializing = false; } private void OnVolumeChanged(float val) { if (isInitializing) return; PlayerPrefs.SetFloat(GameSettings.KeyMasterVolume, val); bool isMuted = muteToggle != null && muteToggle.isOn; if (!isMuted) AudioListener.volume = val; UpdateVolumeLabel(val, isMuted); } private void OnMuteChanged(bool isMuted) { if (isInitializing) return; PlayerPrefs.SetInt(GameSettings.KeyIsMuted, isMuted ? 1 : 0); float currentVol = volumeSlider != null ? volumeSlider.value : 1.0f; AudioListener.volume = isMuted ? 0f : currentVol; UpdateVolumeLabel(currentVol, isMuted); } private void UpdateVolumeLabel(float vol, bool muted) { if (volumeValueText != null) { volumeValueText.text = muted ? "ВЫКЛ" : $"{Mathf.RoundToInt(vol * 100)}%"; } } private void OnQualityChanged(int index) { if (isInitializing) return; QualitySettings.SetQualityLevel(index, true); PlayerPrefs.SetInt(GameSettings.KeyQualityLevel, index); } private void OnFullscreenChanged(bool isFullscreen) { if (isInitializing) return; Screen.fullScreen = isFullscreen; PlayerPrefs.SetInt(GameSettings.KeyFullscreen, isFullscreen ? 1 : 0); } private void OnSensitivityChanged(float val) { if (isInitializing) return; PlayerPrefs.SetFloat(GameSettings.KeyMouseSensitivity, val); UpdateSensitivityLabel(val); } private void UpdateSensitivityLabel(float val) { if (sensitivityValueText != null) { sensitivityValueText.text = $"{val:F1}x"; } } private string TranslateQuality(string q) { switch (q.ToLower()) { case "very low": return "Очень низкое"; case "low": return "Низкое"; case "medium": return "Среднее"; case "high": return "Высокое"; case "very high": return "Очень высокое"; case "ultra": return "Ультра"; default: return q; } } }