using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
[LuaCallCSharp]
public class SoundManager : MonoBehaviour
{
private float bgmVolumScale = 1f; //背景音樂聲音大小比例
private float effVolumScale = 0.5f; //音效聲音大小比例
public List<AudioSource> audioSourceList = new List<AudioSource>(); //音效播放器
private AudioSource musicAudio; //背景音樂播放器
GameObject thisObj;
Transform thisTrans;
// Start is called before the first frame update
public static SoundManager Init()
{
GameObject obj = new GameObject("SoundManager");
SoundManager soundManager = obj.AddComponent<SoundManager>();
obj.AddComponent<AudioListener>();
return soundManager;
}
private void Awake()
{
thisObj = gameObject;
thisTrans = transform;
//存儲關閉時的音量比例
if (PlayerPrefs.HasKey("bgmVolumScale"))
bgmVolumScale = PlayerPrefs.GetFloat("bgmVolumScale");
if (PlayerPrefs.HasKey("effVolumScale"))
effVolumScale = PlayerPrefs.GetFloat("effVolumScale");
musicAudio = gameObject.AddComponent<AudioSource>();
musicAudio.playOnAwake = false;
musicAudio.loop = true;
musicAudio.volume = bgmVolumScale;
//FadeVolumeScale = FadeVolume / FadeDistance;
InitAudioSources();
DontDestroyOnLoad(gameObject);
}
//增加as組件播放器
void InitAudioSources()
{
for (int i = 0; i < 20; i++)
{
GameObject obj = new GameObject("AudioSource" + (i + 1));
obj.transform.SetParent(thisTrans);
AudioSource audio = obj.AddComponent<AudioSource>();
audio.playOnAwake = false;
audio.loop = false;
audioSourceList.Add(audio);
}
}
//解暫停
public void UnPause()
{
musicAudio.UnPause();
foreach (var item in audioSourceList)
item.UnPause();
}
//暫停所有聲音
public void Pause()
{
musicAudio.Pause();
foreach (var item in audioSourceList)
item.Pause();
}
//停止所有聲音
public void Stop()
{
musicAudio.Stop();
foreach (var item in audioSourceList)
item.Stop();
}
//設置靜音
public void SetMute(bool isMute)
{
musicAudio.mute = isMute;
for (int i = 0, imax = audioSourceList.Count; i < imax; i++)
{
audioSourceList[i].mute = isMute;
}
}
/// <summary>
/// set the bgm scale [0,1]
/// </summary>
/// <param name="scale"></param>
public void SetBGMVolumScale(float scale)
{
bgmVolumScale = scale;
musicAudio.volume = bgmVolumScale;
PlayerPrefs.SetFloat("bgmVolumScale", bgmVolumScale);
}
/// <summary>
/// set the soundeff scale [0,1]
/// </summary>
/// <param name="scale"></param>
public void SetEFFVolumScale(float scale)
{
effVolumScale = scale;
PlayerPrefs.SetFloat("effVolumScale", effVolumScale);
}
//獲取背景音樂音量0-1
public float GetBGMVolumScale()
{
return bgmVolumScale;
}
//獲取音效音量0-1
public float GetEFFVolumScale()
{
return effVolumScale;
}
//播放背景音樂
public void PlayMusic(string music, bool isLoop = false)
{
if (IsPlayMusic(music))
return;
AudioClip clip = GetClipByName(music);
PlayMusic(clip);
}
public void StopMusic()
{
musicAudio.Stop();
}
//是否正在播放music
private bool IsPlayMusic(string music)
{
if (musicAudio.isPlaying)
{
return musicAudio.clip.name == music;
}
return false;
}
//是否正在播放音效
public bool IsPlaySoundEff(string eff)
{
for (int i = 0; i < audioSourceList.Count; i++)
{
var audio = audioSourceList[i];
if (audio.isPlaying && audio.clip.name == eff)
return true;
}
return false;
}
//播放背景音樂
private void PlayMusic(AudioClip clip)
{
musicAudio.loop = true;
musicAudio.clip = clip;
musicAudio.Play();
}
//播放2d音效 eff loop 是否循環
public void PlaySoundEff2D(string eff, bool loop = false)
{
AudioClip clip = GetClipByName(eff);
PlaySoundEff2D(clip, loop);
}
//播放2d音效 clip loop 是否循環
private void PlaySoundEff2D(AudioClip clip, bool loop = false)
{
if (clip == null)
return;
AudioSource audioSrc = GetCurrentAudioSource();
audioSrc.loop = loop;
audioSrc.clip = clip;
audioSrc.volume = effVolumScale;
audioSrc.Play();
}
public void StopAllSoudEff()
{
foreach (var item in audioSourceList)
{
item.Stop();
}
}
public void PlayMusicEx(string asset)
{
AudioClip clip = GetClipByName(asset);
PlayMusic(clip);
}
public void PlaySoundEff2DEx(string asset, bool loop = false)
{
AudioClip clip = GetClipByName(asset);
PlaySoundEff2D(clip, loop);
}
public void StopSoundEffEx(string asset)
{
int posLeft = asset.LastIndexOf('/');
int posRight = asset.LastIndexOf('.');
string name = asset.Substring(posLeft + 1, posRight - posLeft - 1);
foreach (var item in audioSourceList)
{
if (item.isPlaying && item.clip.name == name)
{
item.Stop();
}
}
}
//停止某音效
public void StopSoundEff(string eff)
{
foreach (var item in audioSourceList)
{
if (item.isPlaying && item.clip.name == eff)
{
item.Stop();
}
}
}
//停止某音效
private void StopSoundEff(AudioClip clip)
{
StopSoundEff(clip.name);
}
//獲取當前可用播放器
private AudioSource GetCurrentAudioSource()
{
AudioSource audioSrc = null;
for (int i = 0, imax = audioSourceList.Count; i < imax; i++)
{
if (audioSourceList[i].isPlaying == false)
{
audioSrc = audioSourceList[i];
}
}
if (audioSrc == null)
{
audioSrc = audioSourceList[0];
}
return audioSrc;
}
public AudioClip GetClipByName(string name)
{
return GameEntry.ResManager.GetAudioClip(name);
}
}