|
|
@@ -1,41 +1,75 @@
|
|
|
using UnityEngine;
|
|
|
-using UnityEngine.Audio;
|
|
|
using UnityEngine.UI;
|
|
|
+using UnityEngine.Audio;
|
|
|
+using UnityEngine.SceneManagement;
|
|
|
+using TMPro;
|
|
|
|
|
|
public class MasterController : MonoBehaviour
|
|
|
{
|
|
|
+ public static MasterController Instance;
|
|
|
+
|
|
|
public AudioMixer mixer;
|
|
|
public Slider volumeSlider;
|
|
|
|
|
|
- private static MasterController instance;
|
|
|
-
|
|
|
- void Start()
|
|
|
+ void Awake()
|
|
|
{
|
|
|
-
|
|
|
+ if (Instance != null && Instance != this)
|
|
|
+ {
|
|
|
+ Destroy(gameObject);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ Instance = this;
|
|
|
+ DontDestroyOnLoad(gameObject);
|
|
|
+
|
|
|
+ ApplySavedVolume();
|
|
|
+ SceneManager.sceneLoaded += OnSceneLoaded;
|
|
|
}
|
|
|
|
|
|
- void Awake()
|
|
|
+ void OnDestroy()
|
|
|
{
|
|
|
- float savedVolume = PlayerPrefs.GetFloat("MasterVolume", 0.75f);
|
|
|
+ SceneManager.sceneLoaded -= OnSceneLoaded;
|
|
|
+ }
|
|
|
|
|
|
- volumeSlider.minValue = 0f;
|
|
|
- volumeSlider.maxValue = 1f;
|
|
|
+ void OnSceneLoaded(Scene scene, LoadSceneMode mode)
|
|
|
+ {
|
|
|
+ // ALWAYS re-apply volume when a scene loads
|
|
|
+ ApplySavedVolume();
|
|
|
|
|
|
- volumeSlider.value = savedVolume;
|
|
|
- SetVolume(savedVolume);
|
|
|
+ // If a slider exists in this scene, sync it
|
|
|
+ if (volumeSlider != null)
|
|
|
+ {
|
|
|
+ float savedVolume = PlayerPrefs.GetFloat("MasterVolume", 0.75f);
|
|
|
+ volumeSlider.SetValueWithoutNotify(savedVolume);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+ void ApplySavedVolume()
|
|
|
+ {
|
|
|
+ float value = PlayerPrefs.GetFloat("MasterVolume", 0.75f);
|
|
|
+ float dB = Mathf.Log10(Mathf.Clamp(value, 0.0001f, 1f)) * 20f;
|
|
|
+ mixer.SetFloat("MasterVolume", dB);
|
|
|
+ }
|
|
|
|
|
|
public void SetVolume(float value)
|
|
|
{
|
|
|
float dB = Mathf.Log10(Mathf.Clamp(value, 0.0001f, 1f)) * 20f;
|
|
|
mixer.SetFloat("MasterVolume", dB);
|
|
|
|
|
|
- Debug.Log($"[Mixer] Setting volume to {value} ({dB} dB)");
|
|
|
-
|
|
|
PlayerPrefs.SetFloat("MasterVolume", value);
|
|
|
PlayerPrefs.Save();
|
|
|
}
|
|
|
|
|
|
+ // Called from Main Menu only
|
|
|
+ public void RegisterSlider(Slider slider)
|
|
|
+ {
|
|
|
+ volumeSlider = slider;
|
|
|
+
|
|
|
+ slider.minValue = 0f;
|
|
|
+ slider.maxValue = 1f;
|
|
|
+
|
|
|
+ float saved = PlayerPrefs.GetFloat("MasterVolume", 0.75f);
|
|
|
+ slider.SetValueWithoutNotify(saved);
|
|
|
+ slider.onValueChanged.AddListener(SetVolume);
|
|
|
+ }
|
|
|
}
|