Files
Fishing2/Assets/@PaulosCreations/AudioVideoOptionsMenu/Scripts_Shared/AudioSettingsMenu.cs
2025-05-29 18:03:24 +08:00

313 lines
9.8 KiB
C#

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Audio;
using TMPro;
namespace PaulosAudioMenu
{
public class AudioSettingsMenu : MonoBehaviour
{
[Header("The Audio Mixer Controller you are using")]
[SerializeField]
private AudioMixer masterMixer;//mixer prefab
[Header("Select wich settings you want to use. Settings set to[UnUsed] can be removed from/disabled in the menu UI")]
[Space(10)]
[SerializeField]
[Tooltip("Changing SpeakerMode Will Reset/Stop all current playing audio !!")]
private SettingsUsedState speakerModeUsed;
[SerializeField]
private SettingsUsedState musicVolumeUsed, fxVolumeUsed, mainVolumeUsed, muteUsed;
[Header("UI elements references")]
[Space(10)]
[SerializeField]
private TMP_Text mainVolumeText;
[SerializeField]
private TMP_Text fxsVolumeText, musicVolumeText, speakerModeText;
[SerializeField]
private Slider mainVolumeSlider, fxsVolumeSlider, musicVolumeSlider;
[SerializeField]
private Toggle muteToggle;
//default values
private bool isMuted = false;
private float currentMainVolume = 1, currentFXsVolume = 1, currentMusicVolume = 1;
private int currentSpeakerMode = 1;//stereo
private bool initiated = false, isApplying;
// Use this for initialization
void Start()
{
LoadMenuVariables();//needs to be in Start, masterMixer not ready yet in Awake
initiated = true;
}
public void UI_ToggleMute()
{
if (muteUsed == SettingsUsedState.notUsed || isApplying)
return;
isMuted = !isMuted;
if (isMuted)
masterMixer.SetFloat("mainVolume", -80);
else masterMixer.SetFloat("mainVolume", Mathf.Log10(currentMainVolume) * 20);
}
public void UI_SetMainVolume(Slider _slider)
{
if (mainVolumeUsed == SettingsUsedState.notUsed || isApplying)
return;
currentMainVolume = _slider.value;
if (!isMuted)
masterMixer.SetFloat("mainVolume", Mathf.Log10(currentMainVolume) * 20);
mainVolumeText.SetText("{0:0}%", _slider.value * 100);
}
public void UI_SetFXsVolume(Slider _slider)
{
if (fxVolumeUsed == SettingsUsedState.notUsed || isApplying)
return;
currentFXsVolume = _slider.value;
masterMixer.SetFloat("fxVolume", Mathf.Log10(currentFXsVolume) * 20);
fxsVolumeText.SetText("{0:0}%", _slider.value * 100);
}
public void UI_SetMusicVolume(Slider _slider)
{
if (musicVolumeUsed == SettingsUsedState.notUsed || isApplying)
return;
currentMusicVolume = _slider.value;
masterMixer.SetFloat("musicVolume", Mathf.Log10(currentMusicVolume) * 20);
musicVolumeText.SetText("{0:0}%", _slider.value * 100);
}
//Changing SpeakerMode Will Reset/Stop all current playing audio !!
public void UI_SetSpeakerMode(int _speakerMode)
{
if (speakerModeUsed == SettingsUsedState.notUsed || isApplying)
return;
currentSpeakerMode = _speakerMode;
AudioConfiguration config = AudioSettings.GetConfiguration();
AudioSpeakerMode wantedMode = config.speakerMode;
string wantedModeText = "";
switch (currentSpeakerMode)
{
case 0:
wantedMode = AudioSpeakerMode.Mono;
wantedModeText = "Mono";
break;
case 1:
wantedMode = AudioSpeakerMode.Stereo;
wantedModeText = "Stereo";
break;
case 2:
wantedMode = AudioSpeakerMode.Quad;
wantedModeText = "4.4";
break;
case 3:
wantedMode = AudioSpeakerMode.Surround;
wantedModeText = "Surround";
break;
case 4:
wantedMode = AudioSpeakerMode.Mode5point1;
wantedModeText = "6.5.1";
break;
case 5:
wantedMode = AudioSpeakerMode.Mode7point1;
wantedModeText = "8.7.1";
break;
case 6:
wantedMode = AudioSpeakerMode.Prologic;
wantedModeText = "Prologic";
break;
}
if (wantedMode != config.speakerMode)
{
config.speakerMode = wantedMode;
speakerModeText.text = wantedModeText;
AudioSettings.OnAudioConfigurationChanged += OnSpeakerModeChanged;
AudioSettings.Reset(config);
}
}
//called when AudioMenu UIPanel is disabled or the menu is closed
public void UI_SaveSettings()
{
if (!initiated)
return;
SaveMenuVariables();
}
private void LoadMenuVariables()
{
if (PlayerPrefs.HasKey("muted"))
{
if (mainVolumeUsed == SettingsUsedState.used)
currentMainVolume = PlayerPrefs.GetFloat("mainVolume");//triggers the UI_SetMainVolume function
if (fxVolumeUsed == SettingsUsedState.used)
currentFXsVolume = PlayerPrefs.GetFloat("fxVolume");//triggers the UI_SetFXsVolume function
if (musicVolumeUsed == SettingsUsedState.used)
currentMusicVolume = PlayerPrefs.GetFloat("musicVolume");//triggers the UI_SetMusicVolume function
if (speakerModeUsed == SettingsUsedState.used)
currentSpeakerMode = PlayerPrefs.GetInt("speakerMode");
if (muteUsed == SettingsUsedState.used)
isMuted = PlayerPrefs.GetInt("muted") == 1 ? true : false;
}
ApplySettings();
}
private void ApplySettings()
{
isApplying = true;
if (speakerModeUsed == SettingsUsedState.used)//must be first
{
AudioConfiguration config = AudioSettings.GetConfiguration();
AudioSpeakerMode wantedMode = config.speakerMode;
string wantedModeText = "";
switch (currentSpeakerMode)
{
case 0:
wantedMode = AudioSpeakerMode.Mono;
wantedModeText = "Mono";
break;
case 1:
wantedMode = AudioSpeakerMode.Stereo;
wantedModeText = "Stereo";
break;
case 2:
wantedMode = AudioSpeakerMode.Quad;
wantedModeText = "4.4";
break;
case 3:
wantedMode = AudioSpeakerMode.Surround;
wantedModeText = "Surround";
break;
case 4:
wantedMode = AudioSpeakerMode.Mode5point1;
wantedModeText = "6.5.1";
break;
case 5:
wantedMode = AudioSpeakerMode.Mode7point1;
wantedModeText = "8.7.1";
break;
case 6:
wantedMode = AudioSpeakerMode.Prologic;
wantedModeText = "Prologic";
break;
}
if (wantedMode != config.speakerMode)
{
config.speakerMode = wantedMode;
AudioSettings.Reset(config);
}
speakerModeText.text = wantedModeText;
}
if (mainVolumeUsed == SettingsUsedState.used)
{
masterMixer.SetFloat("mainVolume", Mathf.Log10(currentMainVolume) * 20);
mainVolumeSlider.value = currentMainVolume;
mainVolumeText.SetText("{0:0}%", mainVolumeSlider.value * 100);
}
if (fxVolumeUsed == SettingsUsedState.used)
{
masterMixer.SetFloat("fxVolume", Mathf.Log10(currentFXsVolume) * 20);
fxsVolumeSlider.value = currentFXsVolume;
fxsVolumeText.SetText("{0:0}%", fxsVolumeSlider.value * 100);
}
if (musicVolumeUsed == SettingsUsedState.used)
{
masterMixer.SetFloat("musicVolume", Mathf.Log10(currentMusicVolume) * 20);
musicVolumeSlider.value = currentMusicVolume;
musicVolumeText.SetText("{0:0}%", musicVolumeSlider.value * 100);
}
if (muteUsed == SettingsUsedState.used)//must be last
{
if (isMuted)
masterMixer.SetFloat("mainVolume", -80);
else masterMixer.SetFloat("mainVolume", Mathf.Log10(currentMainVolume) * 20);
muteToggle.isOn = isMuted;
}
isApplying = false;
}
//triggered when Speakermode has changed, need to reApply the settings (changing speakermode resets all audio)
private void OnSpeakerModeChanged(bool _wasChanged)
{
if (mainVolumeUsed == SettingsUsedState.used)
{
masterMixer.SetFloat("mainVolume", Mathf.Log10(currentMainVolume) * 20);
}
if (fxVolumeUsed == SettingsUsedState.used)
{
masterMixer.SetFloat("fxVolume", Mathf.Log10(currentFXsVolume) * 20);
}
if (musicVolumeUsed == SettingsUsedState.used)
{
masterMixer.SetFloat("musicVolume", Mathf.Log10(currentMusicVolume) * 20);
}
if (muteUsed == SettingsUsedState.used)//must be last
{
if (isMuted)
masterMixer.SetFloat("mainVolume", -80);
else masterMixer.SetFloat("mainVolume", Mathf.Log10(currentMainVolume) * 20);
}
AudioSettings.OnAudioConfigurationChanged -= OnSpeakerModeChanged;
}
private void SaveMenuVariables()
{
PlayerPrefs.SetInt("muted", isMuted == true ? 1 : 0);
PlayerPrefs.SetFloat("mainVolume", currentMainVolume);
PlayerPrefs.SetFloat("fxVolume", currentFXsVolume);
PlayerPrefs.SetFloat("musicVolume", currentMusicVolume);
PlayerPrefs.SetInt("speakerMode", currentSpeakerMode);
}
}
public enum SettingsUsedState { used, notUsed };
}