using UnityEngine; using UnityEngine.UI; using TMPro; using System.Globalization; public class SensitivitySettings : MonoBehaviour { [Header("UI элементы")] [SerializeField] private Slider sensSlider; [SerializeField] private TMP_InputField sensInputField; [Header("Ссылка на игрока")] [SerializeField] private PlayerController playerController; [Header("Границы чувствительности")] [SerializeField] private float minSens = 0.01f; [SerializeField] private float maxSens = 1.0f; [SerializeField] private float defaultSens = 0.1f; private const string SensPrefKey = "MouseSensitivity"; private void Start() { // 1. Настраиваем границы слайдера sensSlider.minValue = minSens; sensSlider.maxValue = maxSens; // 2. Считываем сохраненное значение float savedSens = PlayerPrefs.GetFloat(SensPrefKey, defaultSens); // 3. Устанавливаем стартовые значения без вызова событий sensSlider.SetValueWithoutNotify(savedSens); sensInputField.SetTextWithoutNotify(savedSens.ToString("F3", CultureInfo.InvariantCulture)); ApplySensitivity(savedSens); // 4. Подписываемся на изменения sensSlider.onValueChanged.AddListener(OnSliderChanged); sensInputField.onEndEdit.AddListener(OnInputChanged); } // Когда игрок двигает слайдер private void OnSliderChanged(float value) { // Обновляем текст в поле ввода без вызова OnInputChanged sensInputField.SetTextWithoutNotify(value.ToString("F3", CultureInfo.InvariantCulture)); ApplySensitivity(value); } // Когда игрок ввел число и нажал Enter / убрал фокус private void OnInputChanged(string text) { // Заменяем запятую на точку для корректного парсинга text = text.Replace(',', '.'); if (float.TryParse(text, NumberStyles.Float, CultureInfo.InvariantCulture, out float parsedValue)) { // Ограничиваем введенное значение в пределах min/max float clampedValue = Mathf.Clamp(parsedValue, minSens, maxSens); // Синхронизируем слайдер и текстовое поле sensSlider.SetValueWithoutNotify(clampedValue); sensInputField.SetTextWithoutNotify(clampedValue.ToString("F3", CultureInfo.InvariantCulture)); ApplySensitivity(clampedValue); } else { // Если ввели текст или мусор — возвращаем текущее значение слайдера sensInputField.SetTextWithoutNotify(sensSlider.value.ToString("F3", CultureInfo.InvariantCulture)); } } private void ApplySensitivity(float value) { if (playerController != null) { playerController.SetSensitivity(value); } // Сохраняем настройку PlayerPrefs.SetFloat(SensPrefKey, value); PlayerPrefs.Save(); } private void OnDestroy() { sensSlider.onValueChanged.RemoveListener(OnSliderChanged); sensInputField.onEndEdit.RemoveListener(OnInputChanged); } }