using UnityEngine; using UnityEngine.UI; /// /// Attach this to any volume slider in any scene to automatically sync with saved volume settings /// [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(); } 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); } } }