Files
test/Assets/PerfectWorld/Scripts/Sound/AudioManager.cs
T
Tran Hai Nam d3a7983637 fix move sfx
2026-04-24 17:11:05 +07:00

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();
}
}