122 lines
2.4 KiB
C#
122 lines
2.4 KiB
C#
using System.Collections;
|
|
using UnityEngine;
|
|
using UnityEngine.Audio;
|
|
|
|
namespace OHM.UnityToolkit
|
|
{
|
|
public class AudioManager : MonoBehaviour
|
|
{
|
|
public AudioMixer mixer;
|
|
|
|
public AudioListener listener;
|
|
|
|
public string sfxVolumeParamName;
|
|
|
|
public string musicVolumeParamName;
|
|
|
|
private AudioSource _currentMusicSource;
|
|
|
|
private IEnumerator _crossFadeCoroutine;
|
|
|
|
private void Awake()
|
|
{
|
|
}
|
|
|
|
public void Setup(bool masterEnabled, bool sfxEnabled, bool musicEnabled)
|
|
{
|
|
SetMasterEnabled(masterEnabled);
|
|
SetGroupEnabled(musicVolumeParamName, musicEnabled);
|
|
SetGroupEnabled(sfxVolumeParamName, sfxEnabled);
|
|
}
|
|
|
|
public void SetMasterEnabled(bool enabled)
|
|
{
|
|
if (listener != null)
|
|
{
|
|
listener.enabled = enabled;
|
|
}
|
|
}
|
|
|
|
public void SetMusicEnabled(bool enabled)
|
|
{
|
|
SetGroupEnabled(musicVolumeParamName, enabled);
|
|
}
|
|
|
|
public void SetSFXEnabled(bool enabled)
|
|
{
|
|
SetGroupEnabled(sfxVolumeParamName, enabled);
|
|
}
|
|
|
|
private void SetGroupEnabled(string paramName, bool enabled)
|
|
{
|
|
mixer.SetFloat(paramName, enabled ? 0f : -100f);
|
|
}
|
|
|
|
public void StopCurrentMusic()
|
|
{
|
|
if (_currentMusicSource != null)
|
|
{
|
|
_currentMusicSource.Stop();
|
|
_currentMusicSource = null;
|
|
}
|
|
}
|
|
|
|
public void PlayMusic(AudioSource source)
|
|
{
|
|
StopCrossFade();
|
|
StopCurrentMusic();
|
|
if (source == null)
|
|
{
|
|
return;
|
|
}
|
|
source.volume = 1f;
|
|
source.Play();
|
|
_currentMusicSource = source;
|
|
}
|
|
|
|
private void StopCrossFade()
|
|
{
|
|
if (_crossFadeCoroutine != null)
|
|
{
|
|
StopCoroutine(_crossFadeCoroutine);
|
|
_crossFadeCoroutine = null;
|
|
}
|
|
}
|
|
|
|
public void CrossFadeMusic(AudioSource newSource, float duration)
|
|
{
|
|
StopCrossFade();
|
|
_crossFadeCoroutine = CrossFadeCoroutine(_currentMusicSource, newSource, duration);
|
|
_currentMusicSource = newSource;
|
|
StartCoroutine(_crossFadeCoroutine);
|
|
}
|
|
|
|
private IEnumerator CrossFadeCoroutine(AudioSource prevSource, AudioSource newSource, float duration)
|
|
{
|
|
if (newSource != null)
|
|
{
|
|
newSource.Play();
|
|
}
|
|
for (float t = 0f; t < duration; t += Time.deltaTime)
|
|
{
|
|
float ratio = t / duration;
|
|
if (prevSource != null)
|
|
{
|
|
prevSource.volume = 1f - ratio;
|
|
}
|
|
if (newSource != null)
|
|
{
|
|
newSource.volume = ratio;
|
|
}
|
|
yield return new WaitForEndOfFrame();
|
|
}
|
|
if (prevSource != null)
|
|
{
|
|
prevSource.Stop();
|
|
}
|
|
_crossFadeCoroutine = null;
|
|
}
|
|
|
|
}
|
|
}
|