Danro/Assets/Scripts/UI/SettingsUIList.cs

211 lines
7.4 KiB
C#

using System;
using System.Collections.Generic;
using RR.Common.Behaviour.ScriptableObjects;
using RR.Common.Managers;
using RR.Game2D.Core.Managers;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace RR.Common.UI
{
public class SettingsUIList : MonoBehaviour
{
public List<Selectable> settingsList = new();
[Header("Настройки")]
// Volume
[SerializeField] private Slider musicVolumeSlider;
[SerializeField] private Slider sfxVolumeSlider;
// Payment
[SerializeField] private Toggle freeGameToggle;
[SerializeField] private Toggle givingPrizesToggle;
// Player
[SerializeField] private Slider startLivesSlider;
[SerializeField] private Slider increasedLivesSlider;
// Buttons
[SerializeField] private Button statsButton;
[Header("Текст в UI")]
// Text
[SerializeField] private TextMeshProUGUI volumePercentageText;
[SerializeField] private TextMeshProUGUI sfxVolumePercentageText;
[SerializeField] private TextMeshProUGUI startLivesCountText;
[SerializeField] private TextMeshProUGUI increasedLivesCountText;
private SettingsManager settingsManager;
private GameSettings currentSettings;
private void Awake()
{
settingsManager = SettingsManager.Instance;
if (settingsManager == null)
{
GameManager.Logger.LogError(name, "SettingsManager is null!");
return;
}
settingsList.Add(musicVolumeSlider);
settingsList.Add(sfxVolumeSlider);
settingsList.Add(freeGameToggle);
settingsList.Add(givingPrizesToggle);
settingsList.Add(startLivesSlider);
settingsList.Add(increasedLivesSlider);
settingsList.Add(statsButton);
currentSettings = settingsManager.GetCurrentGameSettings();
AddListeners();
UpdateSettings(currentSettings);
}
private void OnDestroy()
{
RemoveListeners();
}
public void UpdateSettings(GameSettings newSettings = null)
{
if (newSettings != null) currentSettings = newSettings;
RemoveListeners();
musicVolumeSlider.value = currentSettings.musicVolume;
sfxVolumeSlider.value = currentSettings.sfxVolume;
freeGameToggle.isOn = currentSettings.isFreeGame;
givingPrizesToggle.isOn = currentSettings.isGivingPrizes;
startLivesSlider.value = currentSettings.startLivesCount;
increasedLivesSlider.value = currentSettings.livesIncreasedByCredits;
AddListeners();
}
public void SaveSettings()
{
settingsManager.SaveSettings();
}
private void AddListeners()
{
// Music Volume
if (musicVolumeSlider != null)
{
musicVolumeSlider.onValueChanged.AddListener(settingsManager.SetMusicVolume);
musicVolumeSlider.onValueChanged.AddListener(SetMusicVolumePercentage);
musicVolumeSlider.onValueChanged.AddListener(GameManager.Instance.Audio.SetMusicVolume);
}
// SFX Volume
if (sfxVolumeSlider != null)
{
sfxVolumeSlider.onValueChanged.AddListener(settingsManager.SetSfxVolume);
sfxVolumeSlider.onValueChanged.AddListener(SetSfxVolumePercentage);
sfxVolumeSlider.onValueChanged.AddListener(GameManager.Instance.Audio.SetSfxVolume);
}
// Free game
if (freeGameToggle != null)
{
freeGameToggle.onValueChanged.AddListener(settingsManager.SetIsFreeGame);
}
// Giving prizes
if (givingPrizesToggle != null)
{
givingPrizesToggle.onValueChanged.AddListener(settingsManager.SetIsGivingPrizes);
}
// Start lives
if (startLivesSlider != null)
{
startLivesSlider.onValueChanged.AddListener(value =>
settingsManager.SetStartLivesCount((int)value));
startLivesSlider.onValueChanged.AddListener(SetStartLivesCountText);
}
// Increased lives
if (increasedLivesSlider != null)
{
increasedLivesSlider.onValueChanged.AddListener(value =>
settingsManager.SetLivesIncreasedByCredits((int)value));
increasedLivesSlider.onValueChanged.AddListener(SetIncreasedLivesCountText);
}
}
private void RemoveListeners()
{
// Music Volume
if (musicVolumeSlider != null)
{
musicVolumeSlider.onValueChanged.RemoveListener(settingsManager.SetMusicVolume);
musicVolumeSlider.onValueChanged.AddListener(SetMusicVolumePercentage);
}
// SFX Volume
if (sfxVolumeSlider != null)
{
sfxVolumeSlider.onValueChanged.RemoveListener(settingsManager.SetSfxVolume);
sfxVolumeSlider.onValueChanged.AddListener(SetSfxVolumePercentage);
}
// Free game
if (freeGameToggle != null)
{
freeGameToggle.onValueChanged.RemoveListener(settingsManager.SetIsFreeGame);
}
// Giving prizes
if (givingPrizesToggle != null)
{
givingPrizesToggle.onValueChanged.RemoveListener(settingsManager.SetIsGivingPrizes);
}
// Start lives
if (startLivesSlider != null)
{
startLivesSlider.onValueChanged.RemoveListener(value =>
settingsManager.SetStartLivesCount((int)value));
startLivesSlider.onValueChanged.AddListener(SetStartLivesCountText);
}
// Increased lives
if (increasedLivesSlider != null)
{
increasedLivesSlider.onValueChanged.RemoveListener(value =>
settingsManager.SetLivesIncreasedByCredits((int)value));
increasedLivesSlider.onValueChanged.AddListener(SetIncreasedLivesCountText);
}
}
private void SetMusicVolumePercentage(float value)
{
if (volumePercentageText == null) return;
int volumePercent = Mathf.RoundToInt(value * 100);
volumePercentageText.text = $"{volumePercent}%";
}
private void SetSfxVolumePercentage(float value)
{
if (sfxVolumePercentageText == null) return;
int sfxVolumePercent = Mathf.RoundToInt(value * 100);
sfxVolumePercentageText.text = $"{sfxVolumePercent}%";
}
private void SetStartLivesCountText(float value)
{
if (startLivesCountText == null) return;
startLivesCountText.text = $"{(int)value}";
}
private void SetIncreasedLivesCountText(float value)
{
if (increasedLivesCountText == null) return;
increasedLivesCountText.text = $"{(int)value}";
}
}
}