152 lines
4.3 KiB
C#
152 lines
4.3 KiB
C#
using System.Collections;
|
|
using BrewMonster;
|
|
using UnityEngine;
|
|
using UnityEngine.Audio;
|
|
|
|
public class AudioManager : MonoBehaviour
|
|
{
|
|
public static AudioManager Instance;
|
|
|
|
public AudioSource bgmSource;
|
|
|
|
[SerializeField] private AudioMixerGroup _bgmMixerGroup;
|
|
[SerializeField] private AudioMixerGroup _ambienceMixerGroup;
|
|
[SerializeField] private AudioMixerGroup _sfxMixerGroup;
|
|
public AudioMixerGroup GetSfxMixerGroup => _sfxMixerGroup;
|
|
private AudioSource _ambienceSource;
|
|
|
|
void Awake()
|
|
{
|
|
if (Instance == null)
|
|
{
|
|
Instance = this;
|
|
DontDestroyOnLoad(gameObject);
|
|
}
|
|
else
|
|
{
|
|
Destroy(gameObject);
|
|
return;
|
|
}
|
|
|
|
DiscoverAudioSources();
|
|
}
|
|
|
|
private void DiscoverAudioSources()
|
|
{
|
|
var sources = GetComponents<AudioSource>();
|
|
|
|
if (sources.Length > 0)
|
|
{
|
|
bgmSource = sources[0];
|
|
if (_bgmMixerGroup != null)
|
|
bgmSource.outputAudioMixerGroup = _bgmMixerGroup;
|
|
}
|
|
|
|
if (sources.Length > 1)
|
|
{
|
|
_ambienceSource = sources[1];
|
|
if (_ambienceMixerGroup != null)
|
|
_ambienceSource.outputAudioMixerGroup = _ambienceMixerGroup;
|
|
}
|
|
}
|
|
|
|
// ── BGM ──────────────────────────────────────────────────────────────────
|
|
|
|
public void PlayBGM(AudioClip clip, float fadeTime = 1f)
|
|
{
|
|
StartCoroutine(FadeInBGM(clip, fadeTime));
|
|
}
|
|
|
|
public void StopBGM(float fadeTime = 1f)
|
|
{
|
|
StartCoroutine(FadeOutBGM(fadeTime));
|
|
}
|
|
|
|
IEnumerator FadeInBGM(AudioClip clip, float fadeTime)
|
|
{
|
|
// BMLogger.LogError($"HoangDev: FadeInBGM fadeTime {fadeTime} clip: {clip.name}" );
|
|
if (bgmSource.isPlaying)
|
|
yield return StartCoroutine(FadeOutBGM(fadeTime));
|
|
|
|
bgmSource.clip = clip;
|
|
bgmSource.Play();
|
|
|
|
float t = 0f;
|
|
while (t < fadeTime)
|
|
{
|
|
t += Time.deltaTime;
|
|
bgmSource.volume = Mathf.Lerp(0f, 1f, t / fadeTime);
|
|
yield return null;
|
|
}
|
|
bgmSource.volume = 1f;
|
|
}
|
|
|
|
IEnumerator FadeOutBGM(float fadeTime)
|
|
{
|
|
float startVol = bgmSource.volume;
|
|
float t = 0f;
|
|
while (t < fadeTime)
|
|
{
|
|
t += Time.deltaTime;
|
|
bgmSource.volume = Mathf.Lerp(startVol, 0f, t / fadeTime);
|
|
yield return null;
|
|
}
|
|
bgmSource.volume = 0f;
|
|
bgmSource.Stop();
|
|
}
|
|
|
|
// ── World music (BGM + ambience together) ────────────────────────────────
|
|
|
|
public void PlayWorldMusic(AudioClip bgm, AudioClip ambience, float fadeTime = 1f)
|
|
{
|
|
if (bgm != null)
|
|
StartCoroutine(FadeInBGM(bgm, fadeTime));
|
|
|
|
if (ambience != null && _ambienceSource != null)
|
|
StartCoroutine(FadeInAmbience(ambience, fadeTime));
|
|
}
|
|
|
|
public void StopWorldMusic(float fadeTime = 1f)
|
|
{
|
|
StopBGM(fadeTime);
|
|
|
|
if (_ambienceSource != null && _ambienceSource.isPlaying)
|
|
StartCoroutine(FadeOutAmbience(fadeTime));
|
|
}
|
|
|
|
// ── Ambience ─────────────────────────────────────────────────────────────
|
|
|
|
IEnumerator FadeInAmbience(AudioClip clip, float fadeTime)
|
|
{
|
|
if (_ambienceSource.isPlaying)
|
|
yield return StartCoroutine(FadeOutAmbience(fadeTime));
|
|
|
|
_ambienceSource.clip = clip;
|
|
_ambienceSource.loop = true;
|
|
_ambienceSource.Play();
|
|
|
|
float t = 0f;
|
|
while (t < fadeTime)
|
|
{
|
|
t += Time.deltaTime;
|
|
_ambienceSource.volume = Mathf.Lerp(0f, 1f, t / fadeTime);
|
|
yield return null;
|
|
}
|
|
_ambienceSource.volume = 1f;
|
|
}
|
|
|
|
IEnumerator FadeOutAmbience(float fadeTime)
|
|
{
|
|
float startVol = _ambienceSource.volume;
|
|
float t = 0f;
|
|
while (t < fadeTime)
|
|
{
|
|
t += Time.deltaTime;
|
|
_ambienceSource.volume = Mathf.Lerp(startVol, 0f, t / fadeTime);
|
|
yield return null;
|
|
}
|
|
_ambienceSource.volume = 0f;
|
|
_ambienceSource.Stop();
|
|
}
|
|
}
|