95 lines
2.5 KiB
C#
95 lines
2.5 KiB
C#
using System.Collections;
|
|
using UnityEngine;
|
|
|
|
public class SoundManager : MonoBehaviour
|
|
{
|
|
public static SoundManager Instance { get; private set; }
|
|
|
|
[Header("Sound Settings")]
|
|
[Range(0f,1f)] public float masterVolume;
|
|
[Range(0f,1f)] public float musicVolume;
|
|
[Range(0f,1f)] public float sfxVolume;
|
|
[SerializeField] private float fadeTime;
|
|
|
|
[Header("Music")]
|
|
[SerializeField] private AudioSource baseMusic;
|
|
[SerializeField] private AudioSource[] dimensionMusicLayer;
|
|
|
|
[Header("Debug Values")]
|
|
[SerializeField, ReadOnly] private int dimensionMusicID;
|
|
|
|
private void Awake()
|
|
{
|
|
if (Instance != null && Instance != this)
|
|
{
|
|
Destroy(gameObject);
|
|
}
|
|
else
|
|
{
|
|
Instance = this;
|
|
baseMusic.volume = masterVolume * musicVolume;
|
|
foreach (var layer in dimensionMusicLayer)
|
|
{
|
|
layer.volume = 0;
|
|
}
|
|
|
|
dimensionMusicID = -1;
|
|
DontDestroyOnLoad(gameObject);
|
|
}
|
|
}
|
|
|
|
public void SwitchMusicLayer(int dimensionID)
|
|
{
|
|
if (dimensionMusicID != -1) StartCoroutine(FadeOut(dimensionMusicID));
|
|
if (dimensionID != -1) StartCoroutine(FadeIn(dimensionID));
|
|
dimensionMusicID = dimensionID;
|
|
}
|
|
|
|
private IEnumerator FadeIn(int dimensionID)
|
|
{
|
|
float time = 0;
|
|
while (time < fadeTime)
|
|
{
|
|
time += 0.05f;
|
|
dimensionMusicLayer[dimensionID].volume = Mathf.Lerp(0, masterVolume * musicVolume, time / fadeTime);
|
|
yield return new WaitForSeconds(0.05f);
|
|
}
|
|
}
|
|
|
|
private IEnumerator FadeOut(int dimensionID)
|
|
{
|
|
float time = 0;
|
|
while (time < fadeTime)
|
|
{
|
|
time += 0.05f;
|
|
dimensionMusicLayer[dimensionID].volume = Mathf.Lerp(masterVolume * musicVolume, 0, time / fadeTime);
|
|
yield return new WaitForSeconds(0.05f);
|
|
}
|
|
}
|
|
|
|
public void OnMasterVolumeChanged(float value)
|
|
{
|
|
masterVolume = value;
|
|
SetAllSoundsVolume();
|
|
}
|
|
|
|
public void OnMusicVolumeChanged(float value)
|
|
{
|
|
musicVolume = value;
|
|
SetAllSoundsVolume();
|
|
}
|
|
|
|
public void OnSfxVolumeChanged(float value)
|
|
{
|
|
sfxVolume = value;
|
|
SetAllSoundsVolume();
|
|
}
|
|
|
|
private void SetAllSoundsVolume()
|
|
{
|
|
var trueMusicVolume = masterVolume * musicVolume;
|
|
baseMusic.volume = trueMusicVolume;
|
|
if (dimensionMusicID != -1) dimensionMusicLayer[dimensionMusicID].volume = trueMusicVolume;
|
|
}
|
|
}
|