244 lines
7.1 KiB
C#
244 lines
7.1 KiB
C#
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<string> options = new List<string>();
|
|
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;
|
|
}
|
|
}
|
|
}
|