using System; using Core; using DG.Tweening; using PermanentSystems; using Systems; using UnityEngine; using UnityEngine.Serialization; using UnityEngine.UI; using Application = Core.Application; namespace Panels { public class SettingsPanel : PanelBase { [SerializeField] private RectTransform settingsHolder; [SerializeField] private float animationDuration = .6f; [SerializeField] private Ease onOpenEase = Ease.OutBounce; [SerializeField] private Ease onCloseEase = Ease.InBack; [SerializeField] private Slider musicSlider; [SerializeField] private Slider effectsSlider; [SerializeField] private Slider sensitivitySlider; [SerializeField] private Toggle vibrationToggle; [SerializeField] private Button saveBtn; private PersistantDataController _dataController; private PersistantDataController DataController { get { if (_dataController == null) _dataController = Application.GetSystem(); return _dataController; } } private PlayerController _controller; private PlayerController Controller { get { if (_controller == null) _controller = Application.GetSystem(); return _controller; } } protected override void ReleaseReferences() { settingsHolder = null; _controller = null; _dataController = null; base.ReleaseReferences(); } public override void Initialize() { saveBtn.onClick.AddListener(SaveAndExit); musicSlider.onValueChanged.AddListener(UpdateMusic); effectsSlider.onValueChanged.AddListener(UpdateSounds); sensitivitySlider.onValueChanged.AddListener(UpdateSensitivity); vibrationToggle.onValueChanged.AddListener(UpdateVibrationSetting); var data = DataController.PlayerData; musicSlider.value = data.musicVolume; effectsSlider.value = data.soundEffectsVolume; sensitivitySlider.value = data.inputSensitivity; vibrationToggle.isOn = data.enableVibrations; } public override void OpenPanel(Action callBack = null) { OpenPanelImmediately(); settingsHolder.localScale = Vector3.zero; settingsHolder.DOScale(Vector3.one * 1.5f, animationDuration) .SetEase(onOpenEase) .OnComplete(() => callBack?.Invoke()); } private void UpdateMusic(float inVolume) { DataController.UpdateMusicVolume(inVolume); AudioSystem.UpdateMusicVolume(inVolume); } private void UpdateSounds(float inVolume) { DataController.UpdateSoundEffectsVolume(inVolume); AudioSystem.UpdateSfxVolume(inVolume); } private void UpdateSensitivity(float inValue) { DataController.UpdateSensitivity(inValue); Controller.BindSpeed(inValue); } private void UpdateVibrationSetting(bool inState) { DataController.UpdateVibration(inState); Controller.UpdateVibrations(inState); } private void SaveAndExit() { DataController.SaveData(); settingsHolder.DOScale(Vector3.zero, animationDuration) .SetEase(onCloseEase) .OnComplete(ClosePanelImmediately); } } }