144 lines
3.8 KiB
C#
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);
|
||
|
}
|
||
|
}
|
||
|
}
|