91 lines
3.4 KiB
C#
91 lines
3.4 KiB
C#
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);
|
|
}
|
|
} |