控制播放音效和音乐是不同的
音乐是循环的,音效是播完直接播下一个,控制时音效音量大小用音乐的,但是开关用bool值,而不是用控制音乐的方法Pause()
using System.Collections;
//音乐管理类,继承单例类
public class MusicMgr : MonoSingleton<MusicMgr>
{
// 用于播放背景音乐的音乐源
private AudioSource m_bgMusic;
// 用于播放音效的音乐源
private AudioSource m_effectMusic;
// 控制背景音乐音量大小
public float BgVolume
{
get
{
return m_bgMusic.volume;
}
set
{
m_bgMusic.volume = value;
}
}
//控制音效音量的大小
public float EffectVolmue
{
get
{
return m_effectMusic.volume;
}
set
{
m_effectMusic.volume = value;
}
}
private bool _isPlayEffect = true;
//重写虚方法
protected override void Awake()
{
base.Awake();
//实例化音乐源
m_bgMusic = gameObject.AddComponent<AudioSource>();
m_bgMusic.loop = true; //开启循环
m_bgMusic.playOnAwake = false; //开始播放
//实例化音乐源
m_effectMusic = gameObject.AddComponent<AudioSource>();
m_effectMusic.loop = true;
m_effectMusic.playOnAwake = false;
}
private void Start()
{
if (Config.Instance.isOnBg)
{
m_bgMusic.Play();
}
else
{
m_bgMusic.Pause();
}
_isPlayEffect = Config.Instance.isOnEffect ? true : false;
BgVolume = Config.Instance.volume;
EffectVolmue = Config.Instance.volume;
}
// 播放背景音乐,传进一个音频剪辑的name
private void PlayBgBase(object bgName, bool restart = false)
{
//定义一个空的字符串
string curBgName = string.Empty;
//如果这个音乐源的音频剪辑不为空的话
if (m_bgMusic.clip != null)
{
//得到这个音频剪辑的name
curBgName = m_bgMusic.clip.name;
}
// 根据用户的音频片段名称, 找到AuioClip, 然后播放,
//ResourcesMgr是提前定义好的查找音频剪辑对应路径的单例脚本,并动态加载出来
AudioClip clip = ResourcesMgr.Instance.Load<AudioClip>(bgName);
//如果找到了,不为空
if (clip != null)
{
//如果这个音频剪辑已经复制给类音频源,切正在播放,那么直接跳出
if (clip.name == curBgName && !restart)
{
return;
}
//否则,把改音频剪辑赋值给音频源,然后播放
m_bgMusic.clip = clip;
m_bgMusic.Play();
}
else
{
//没找到直接报错
// 异常, 调用写日志的工具类.
UnityEngine.Debug.Log("没有找到音频片段");
}
}
//播放各种音频剪辑的调用方法,MusicType是提前写好的存放各种音乐名称的枚举类,便于外面直接调用
public void PlayBg(MusicType.Feeds bgName, bool restart = false)
{
PlayBgBase(bgName, restart);
}
public void PlayBg(MusicType.Items bgName, bool restart = false)
{
PlayBgBase(bgName, restart);
}
public void PlayBg(MusicType.Main bgName, bool restart = false)
{
PlayBgBase(bgName, restart);
}
public void PlayBg(MusicType.Monsters bgName, bool restart = false)
{
PlayBgBase(bgName, restart);
}
public void PlayBg(MusicType.Towers bgName, bool restart = false)
{
PlayBgBase(bgName, restart);
}
// 播放音效
private void PlayEffectBase(object effectName, bool defAudio = true, float volume = 1f)
{
if (!_isPlayEffect)
{
return;
}
//根据查找路径加载对应的音频剪辑
AudioClip clip = ResourcesMgr.Instance.Load<AudioClip>(effectName);
//如果为空的话,直接报错,然后跳出
if (clip == null)
{
UnityEngine.Debug.Log("没有找到音效片段");
return;
}
//否则,就是clip不为空的话,如果defAudio=true,直接播放
if (defAudio)
{
//PlayOneShot (音频剪辑, 音量大小)
m_effectMusic.PlayOneShot(clip, volume);
}
else
{
//指定点播放
AudioSource.PlayClipAtPoint(clip, Camera.main.transform.position, volume);
}
}
//播放各种音频剪辑的调用方法,MusicType是提前写好的存放各种音乐名称的枚举类,便于外面直接调用
public void PlayEffect(MusicType.Feeds effectName, bool defAudio = true, float volume = 1f)
{
PlayEffectBase(effectName, defAudio, volume);
}
public void PlayEffect(MusicType.Items effectName, bool defAudio = true, float volume = 1f)
{
PlayEffectBase(effectName, defAudio, volume);
}
public void PlayEffect(MusicType.Main effectName, bool defAudio = true, float volume = 1f)
{
PlayEffectBase(effectName, defAudio, volume);
}
public void PlayEffect(MusicType.Monsters effectName, bool defAudio = true, float volume = 1f)
{
PlayEffectBase(effectName, defAudio, volume);
}
public void PlayEffect(MusicType.Towers effectName, bool defAudio = true, float volume = 1f)
{
PlayEffectBase(effectName, defAudio, volume);
}
public void StopEffect() {
m_effectMusic.Stop();
m_effectMusic.clip = null;
}
public void StopBg()
{
m_bgMusic.Stop();
m_bgMusic.clip = null;
}
//暂停
public void PauseBgMusic() {
m_bgMusic.Pause();
}
//回复
public void ResumeBgMusic() {
m_bgMusic.Play();
}
public void PauseEffect()
{
_isPlayEffect = false;
}
public void ResumeEffect()
{
_isPlayEffect = true;
}
}