RepoTown/Assets/Scripts/VolumeSliderSync.cs
2025-07-25 15:29:14 +05:00

144 lines
3.8 KiB
C#

using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// Attach this to any volume slider in any scene to automatically sync with saved volume settings
/// </summary>
[RequireComponent(typeof(Slider))]
public class VolumeSliderSync : MonoBehaviour
{
[Header("Slider Type")]
[Tooltip("What type of volume does this slider control?")]
public VolumeType volumeType = VolumeType.Music;
[Header("Auto Setup")]
[Tooltip("Should this slider automatically setup on Start?")]
public bool autoSetup = true;
public enum VolumeType
{
Music,
SFX,
Master
}
private Slider volumeSlider;
private bool isInitialized = false;
void Awake()
{
volumeSlider = GetComponent<Slider>();
}
void Start()
{
if (autoSetup)
{
SetupSlider();
}
}
public void SetupSlider()
{
if (isInitialized) return;
// Wait for AudioManager to be ready
if (AudioManager.Instance == null)
{
// Try again next frame
Invoke(nameof(SetupSlider), 0.1f);
return;
}
// Load the appropriate volume value
float currentVolume = GetCurrentVolumeValue();
// Set slider value without triggering events
volumeSlider.SetValueWithoutNotify(currentVolume);
// Remove any existing listeners
volumeSlider.onValueChanged.RemoveAllListeners();
// Add the appropriate listener
switch (volumeType)
{
case VolumeType.Music:
volumeSlider.onValueChanged.AddListener(OnMusicVolumeChanged);
break;
case VolumeType.SFX:
volumeSlider.onValueChanged.AddListener(OnSFXVolumeChanged);
break;
case VolumeType.Master:
volumeSlider.onValueChanged.AddListener(OnMasterVolumeChanged);
break;
}
isInitialized = true;
Debug.Log($"VolumeSliderSync: {volumeType} slider initialized to {currentVolume}");
}
float GetCurrentVolumeValue()
{
switch (volumeType)
{
case VolumeType.Music:
return PlayerPrefs.GetFloat("MusicVolume", 1f);
case VolumeType.SFX:
return PlayerPrefs.GetFloat("SFXVolume", 1f);
case VolumeType.Master:
return PlayerPrefs.GetFloat("MasterVolume", 1f);
default:
return 1f;
}
}
void OnMusicVolumeChanged(float value)
{
if (AudioManager.Instance != null)
{
AudioManager.Instance.SetMusicVolume(value);
}
if (GameSettingsManager.Instance != null)
{
GameSettingsManager.Instance.SetMusicVolume(value);
}
}
void OnSFXVolumeChanged(float value)
{
if (AudioManager.Instance != null)
{
AudioManager.Instance.SetSFXVolume(value);
}
}
void OnMasterVolumeChanged(float value)
{
if (AudioManager.Instance != null)
{
AudioManager.Instance.SetMasterVolume(value);
}
}
// Call this if you need to refresh the slider after volume changes
public void RefreshSlider()
{
if (volumeSlider != null)
{
float currentVolume = GetCurrentVolumeValue();
volumeSlider.SetValueWithoutNotify(currentVolume);
}
}
// Call this from the scene loaded event if needed
void OnEnable()
{
// Try to setup when enabled (useful for scene transitions)
if (autoSetup && !isInitialized)
{
Invoke(nameof(SetupSlider), 0.1f);
}
}
}