1.思路:
游戏中的声音主要分为两种:一种是背景音乐,一种是音效(频繁切换)
对于两种声音这样进行管理:
背景音乐:由一个空物体上的一个AudioSource进行控制,我们只需对它进行暂停、停止、开始等操作。
音效:在游戏中,音效往往需要频繁切换,我们也用一个空物体进行控制,只不过不只用一个AudioSource,而是动态的进行增加和减少AudioSource组件,当有音效需要播放时,在空物体上增加一个AudioSource组件播放,停止时或者播放完则移除该组件,下一次播放也一样。
2.代码
public class MusicManager : SingeCaseBase<MusicManager>
{
//BGM部分
AudioSource BgmAudio = null;
float BgmVolume = 1;
//Sound音效部分
GameObject SoundAudioHolder = null;
List<AudioSource> SoundAudios=null;
float SoundVolume = 1;
public MusicManager()
{
//实时监测有无播放完的音效,进行销毁
MonoManager.GetInstance().AddUpdateAction(CheckSound);
}
//BGM部分
public void StartBgm(string BgmName)
{
//创建一个空物体挂载Bgm的AudioSource
if(BgmAudio == null)
{
GameObject bgmHolder = new GameObject("bgmHolder");
BgmAudio = bgmHolder.AddComponent<AudioSource>();
}
//异步加载BGM资源,并播放
ResourcesManager.GetInstance().LoadResourceAsync<AudioClip>("Music/" + BgmName,(bgmClip)=> {
BgmAudio.clip = bgmClip;
BgmAudio.loop = true;
BgmAudio.volume = BgmVolume;
BgmAudio.Play();
});
}
/// <summary>
/// 暂停BGM
/// </summary>
public void PauseBgm()
{
if (BgmAudio != null)
{
BgmAudio.Pause();
}
}
/// <summary>
/// 停止BGM
/// </summary>
public void StopBgm()
{
if (BgmAudio != null)
{
BgmAudio.Stop();
}
}
/// <summary>
/// 调整BGM音量大小
/// </summary>
/// <param name="v"></param>
public void ChangeBgmVolume(float v)
{
if (BgmAudio == null)
return;
BgmVolume = v;
BgmAudio.volume = v;
}
/// <summary>
/// 播放音效
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public AudioSource StartSound(string name)
{
if(SoundAudioHolder == null)
{
SoundAudioHolder = new GameObject("SoundAudioHolder");
SoundAudios = new List<AudioSource>();
}
AudioSource source = SoundAudioHolder.AddComponent<AudioSource>();
ResourcesManager.GetInstance().LoadResourceAsync<AudioClip>("Clips/" + name, (clip) =>
{
source.clip = clip;
source.loop = false;
source.volume = SoundVolume;
source.Play();
SoundAudios.Add(source);
});
return source;
}
/// <summary>
/// 停止音效
/// </summary>
/// <param name="source"></param>
public void StopSound(AudioSource source)
{
if(SoundAudios.Contains(source))
{
source.Stop();
SoundAudios.Remove(source);
GameObject.Destroy(source);
}
}
/// <summary>
/// 改变音效音量
/// </summary>
/// <param name="v"></param>
public void ChangeSoundVolum(float v)
{
if (SoundAudios != null && SoundAudios.Count >= 0)
{
SoundVolume = v;
foreach (AudioSource source in SoundAudios)
{
source.volume = SoundVolume;
}
}
}
/// <summary>
/// 检测有无播放完的音效组件并销毁
/// </summary>
public void CheckSound()
{
if(SoundAudios!=null&&SoundAudios.Count > 0)
{
for(int i = SoundAudios.Count-1; i >= 0;i--)
{
if (!SoundAudios[i].isPlaying)
{
AudioSource term = SoundAudios[i];
SoundAudios.Remove(SoundAudios[i]);
GameObject.Destroy(term);
}
}
}
}
}