Files
bansonic_beta_main/Assets/scripts/settings/audioMerger.cs
T

193 lines
6.2 KiB
C#
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Audio;
public class audioMerger : MonoBehaviour
{
[Header("Audio Mixer")]
public AudioMixer mainMixer;
[Header("Exposed Parameters")]
public string masterParam = "Master_Vol";
public string noteHitParam = "noteHit_sfx_Vol";
public string musicInGameParam = "inGameMusic_Vol";
public string musicOutGameParam = "outGameMusic_Vol";
public string uiInterationParam = "button_sfx_Vol";
[Header("sv object")]
public GameObject sv_audioSettings;
[Header("Inspector")]
[Tooltip("Documentation text normalized.")]
public Toggle enableGlobalMute_toggle;
[Header("Inspector")]
public Slider mainVolumn_slider;
public Slider noteHit_slider;
public Slider musicInGame_slider;
public Slider musicOutGame_slider;
public Slider skillEffect_slider;
public Slider uiInteration_slider;
public Slider cvVolumn_slider;
[Header("Inspector")]
public Text mainVolumn_text;
public Text noteHit_text;
public Text musicInGame_text;
public Text musicOutGame_text;
public Text skillEffect_text;
public Text uiInteration_text;
public Text cvVolumn_text;
// PlayerPrefs keys
const string PlayerPrefKey_EnableGlobalMute = "EnableGlobalMute";
const string Key_MainVol = "Volume_Main";
const string Key_NoteHitVol = "Volume_NoteHit";
const string Key_MusicInGameVol = "Volume_MusicInGame";
const string Key_MusicOutGameVol = "Volume_MusicOutGame";
const string Key_UiVol = "Volume_UI";
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
Initialize();
}
void OnEnable()
{
// Ensure state is correct whenever the UI is shown
Initialize();
}
void Initialize()
{
// Load saved state (default: false)
bool isOn = PlayerPrefs.GetInt(PlayerPrefKey_EnableGlobalMute, 0) == 1;
// Apply to toggle (if available) and sv_audioSettings
if (enableGlobalMute_toggle != null)
{
enableGlobalMute_toggle.onValueChanged.RemoveAllListeners();
enableGlobalMute_toggle.isOn = isOn;
enableGlobalMute_toggle.onValueChanged.AddListener(OnEnableGlobalMuteChanged);
}
if (sv_audioSettings != null)
{
sv_audioSettings.SetActive(!isOn);
}
InitializeSliders();
}
void InitializeSliders()
{
// Initialize 5 main sliders
SetupSlider(mainVolumn_slider, mainVolumn_text, Key_MainVol, masterParam);
SetupSlider(noteHit_slider, noteHit_text, Key_NoteHitVol, noteHitParam);
SetupSlider(musicInGame_slider, musicInGame_text, Key_MusicInGameVol, musicInGameParam);
SetupSlider(musicOutGame_slider, musicOutGame_text, Key_MusicOutGameVol, musicOutGameParam);
SetupSlider(uiInteration_slider, uiInteration_text, Key_UiVol, uiInterationParam);
}
void SetupSlider(Slider slider, Text text, string prefKey, string mixerParam)
{
if (slider == null) return;
// Ensure slider range is 0 to 1
slider.minValue = 0f;
slider.maxValue = 1f;
// Load saved value (default 1.0f for 100% / 0dB)
float savedVal = PlayerPrefs.GetFloat(prefKey, 1.0f);
slider.value = savedVal;
// Update display and mixer initially
UpdateSliderEffect(slider.value, text, mixerParam);
// Add listener
slider.onValueChanged.RemoveAllListeners();
slider.onValueChanged.AddListener((val) => {
UpdateSliderEffect(val, text, mixerParam);
PlayerPrefs.SetFloat(prefKey, val);
PlayerPrefs.Save();
});
}
void UpdateSliderEffect(float value, Text text, string mixerParam)
{
// 1. Update Text (Linear percentage)
if (text != null)
{
text.text = Mathf.RoundToInt(value * 100f).ToString() + "%";
}
// 2. Update Mixer (Logarithmic)
if (mainMixer != null && !string.IsNullOrEmpty(mixerParam))
{
// Check Global Mute state from PlayerPrefs directly for robustness
bool isMuted = PlayerPrefs.GetInt(PlayerPrefKey_EnableGlobalMute, 0) == 1;
// If this is Master and Global Mute is ON, don't update mixer to anything other than -80dB
if (mixerParam == masterParam && isMuted)
{
mainMixer.SetFloat(mixerParam, -80f);
return;
}
// Normal volume application
float clampedValue = Mathf.Clamp(value, 0.0001f, 1.0f);
float dB = Mathf.Log10(clampedValue) * 20f;
mainMixer.SetFloat(mixerParam, dB);
}
}
void OnDestroy()
{
if (enableGlobalMute_toggle != null)
{
enableGlobalMute_toggle.onValueChanged.RemoveListener(OnEnableGlobalMuteChanged);
}
// Remove listeners from sliders to be safe
RemoveSliderListeners(mainVolumn_slider);
RemoveSliderListeners(noteHit_slider);
RemoveSliderListeners(musicInGame_slider);
RemoveSliderListeners(musicOutGame_slider);
RemoveSliderListeners(uiInteration_slider);
}
void RemoveSliderListeners(Slider slider)
{
if (slider != null) slider.onValueChanged.RemoveAllListeners();
}
// Listener called when the toggle value changes
void OnEnableGlobalMuteChanged(bool isOn)
{
// 1. Save state
PlayerPrefs.SetInt(PlayerPrefKey_EnableGlobalMute, isOn ? 1 : 0);
PlayerPrefs.Save();
// 2. UI visual feedback
if (sv_audioSettings != null)
{
sv_audioSettings.SetActive(!isOn);
}
// 3. Apply mute/unmute to Master
if (mainMixer != null)
{
if (isOn)
{
// Mute: set to -80dB
mainMixer.SetFloat(masterParam, -80f);
}
else
{
// Unmute: restore from PlayerPrefs (Key_MainVol)
float savedVal = PlayerPrefs.GetFloat(Key_MainVol, 1.0f);
UpdateSliderEffect(savedVal, mainVolumn_text, masterParam);
}
}
}
}