313 lines
9.8 KiB
C#
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 };
|
|
}
|
|
|