Souljack/Assets/_Project/Scripts/SensivitySettings.cs

91 lines
3.4 KiB
C#

using UnityEngine;
using UnityEngine.UI;
using TMPro;
using System.Globalization;
public class SensitivitySettingsk : 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);
}
}