/// 一个简单的音乐管理类,第一次有很多不足之处,希望大家可以指点出来。
/// 在一些小型项目中一般音乐分为背景音乐,按钮音乐和一些特效音乐,一般
/// 在设置音量和静音的开关时都会分为: 音乐 和 音效 两个选项,这里对音乐
/// 的控制其实就是背景音乐,而音效就是按钮跟一些特效的音乐。
/// 所以这里就需要3个AudioSource组件来分别播放这些音乐,一个只播放背景,
/// 一个只播放按钮音乐,一个只播放特效的音乐,因为都是只有一个组件在播放,
/// 所以这些不同功能的组件在播音乐的时候,同一时间只能播放一个音乐,最后面
/// 有一个可以同时播放多个音乐的方法,原理就是创建多个AudioSource组件来播放。
/// 但是也不能无限制的来创建AudioSource,所以对数量有限制。
///
/// SoundInstance 单例
/// audioSoundVolume 音效音量
/// audioMusicVolume 音乐音量
/// SoundOnOff 音效开关(true:为开(音量为1) false:为关(静音专用)
/// MusicOnOff 音乐开关(true:为开(音量为1) false:为关)(静音专用)
/// SetPlayMusic 设置并播放音乐(背景音乐)
/// SetMusic 设置音乐(背景音乐) 需要配合PlayMusic才能播放
/// PlayMusic 开始播放音乐(背景音乐) 需要配合SetMusic才能播放
/// StopMusic 停止播放音乐(背景音乐)
/// PlayBtnSound 播放按钮音效
/// PlayEffSound 播放音效(只播放一次)(可循环播放)(音乐播放完执行函数)
/// StopEffSound 停止播放音效(当循环播放音效时可用)
/// addMultiAudioEffect 多音效非相同播放
using
System.
Collections;
using
System.
Collections.
Generic;
using
UnityEngine;
using
UnityEngine.
Events;
public
class
FunctionsSound :
MonoBehaviour
{
///
<
summary
>
/// 音乐
///
</
summary
>
string music
{
get {
return
"backvolume"; }
}
///
<
summary
>
/// 音效
///
</
summary
>
string sound
{
get {
return
"gamevolume"; }
}
///
<
summary
>
/// 音乐默认设置
///
</
summary
>
string musicFirstSet
{
get {
return
"1"; }
}
///
<
summary
>
/// 音效默认设置
///
</
summary
>
string soundFirstSet
{
get {
return
"1"; }
}
///
<
summary
>
/// 声音控制类
///
</
summary
>
static
FunctionsSound _soundInstance;
public
static
FunctionsSound SoundInstance
{
get
{
if (
_soundInstance ==
null)
{
GameObject obj =
new
GameObject(
"SoundManager");
_soundInstance =
obj.
AddComponent<
FunctionsSound>();
}
return
_soundInstance;
}
}
///
<
summary
>
/// 音效播放器(用于播放按钮音乐)
///
</
summary
>
AudioSource _audioSound;
AudioSource audioSound
{
get
{
if (
_audioSound ==
null)
{
_audioSound =
SoundInstance.
gameObject.
AddComponent<
AudioSource>();
_audioSound.
loop =
false;
setVolume(
_audioSound,
float.
Parse(
getSoundPrefs()));
}
return
_audioSound;
}
}
///
<
summary
>
/// 音乐播放器(用于播放背景音乐)
///
</
summary
>
AudioSource _audioMusic;
AudioSource audioMusic
{
get
{
if (
_audioMusic ==
null)
{
_audioMusic =
SoundInstance.
gameObject.
AddComponent<
AudioSource>();
_audioMusic.
loop =
true;
setVolume(
_audioMusic,
float.
Parse(
getMusicPrefs()));
}
return
_audioMusic;
}
}
///
<
summary
>
/// 音效播放器(用于播放效果音乐)
///
</
summary
>
AudioSource _audioEffect;
AudioSource audioEffect
{
get
{
if (
_audioEffect ==
null)
{
_audioEffect =
SoundInstance.
gameObject.
AddComponent<
AudioSource>();
_audioEffect.
loop =
false;
setVolume(
_audioEffect,
float.
Parse(
getSoundPrefs()));
}
return
_audioEffect;
}
}
///
<
summary
>
/// 音效音量
///
</
summary
>
public
float audioSoundVolume
{
get
{
if (
audioSound.
mute)
{
return
0;
}
else
{
return
audioSound.
volume;
}
}
set
{
if (
value <=
0)
{
audioSound.
mute =
true;
audioEffect.
mute =
true;
setSoundPrefs(
"0");
}
else
{
audioSound.
mute =
false;
audioSound.
volume =
value;
audioEffect.
mute =
false;
audioEffect.
volume =
value;
setSoundPrefs(
value.
ToString());
}
}
}
///
<
summary
>
/// 音乐音量
///
</
summary
>
public
float audioMusicVolume
{
get
{
if (
audioMusic.
mute)
{
return
0;
}
else
{
return
audioMusic.
volume;
}
}
set
{
if (
value ==
0)
{
audioMusic.
mute =
true;
setMusicPrefs(
"0");
}
else
{
audioMusic.
mute =
false;
audioMusic.
volume =
value;
setMusicPrefs(
value.
ToString());
}
}
}
///
<
summary
>
/// 音效开关(true:为开(音量为1) false:为关(静音专用)
///
</
summary
>
public
bool SoundOnOff
{
get
{
if (
audioSoundVolume ==
0)
{
return
false;
}
else
{
return
true;
}
}
set
{
if (
value)
{
audioSoundVolume =
1;
}
else
{
audioSoundVolume =
0;
}
}
}
///
<
summary
>
/// 音乐开关(true:为开(音量为1) false:为关)(静音专用)
///
</
summary
>
public
bool MusicOnOff
{
get
{
if (
audioMusicVolume ==
0)
{
return
false;
}
else
{
return
true;
}
}
set
{
if (
value)
{
audioMusicVolume =
1;
}
else
{
audioMusicVolume =
0;
}
}
}
///
<
summary
>
/// 设置并播放音乐(背景音乐)
///
</
summary
>
///
<
param
name
=
"audioClip"
></
param
>
public
void
SetPlayMusic(
AudioClip audioClip)
{
SetMusic(
audioClip);
PlayMusic();
}
///
<
summary
>
/// 设置音乐(背景音乐)
///
</
summary
>
///
<
param
name
=
"audioClip"
></
param
>
public
void
SetMusic(
AudioClip audioClip)
{
audioMusic.
clip =
audioClip;
}
///
<
summary
>
/// 开始播放音乐(背景音乐)
///
</
summary
>
public
void
PlayMusic()
{
if (
audioMusic.
clip !=
null)
{
audioMusic.
Play();
}
else
{
Debug.
LogError(
"警告:当前未设置音乐!");
}
}
///
<
summary
>
/// 停止播放音乐(背景音乐)
///
</
summary
>
public
void
StopMusic()
{
if (
audioMusic.
clip !=
null)
{
if (
audioMusic.
isPlaying ==
true)
{
audioMusic.
Stop();
}
else
{
Debug.
LogError(
"警告:当前音乐未播放!");
}
}
else
{
Debug.
LogError(
"警告:当前未设置音乐!");
}
}
///
<
summary
>
/// 播放按钮音效
///
</
summary
>
///
<
param
name
=
"audioClip"
></
param
>
public
void
PlayBtnSound(
AudioClip audioClip)
{
audioSound.
clip =
audioClip;
audioSound.
Play();
}
///
<
summary
>
/// 播放音效(只播放一次)
///
</
summary
>
///
<
param
name
=
"audioClip"
></
param
>
public
void
PlayEffSound(
AudioClip audioClip)
{
audioEffect.
clip =
audioClip;
audioEffect.
Play();
audioEffect.
loop =
false;
}
///
<
summary
>
/// 播放音效(可循环播放)
///
</
summary
>
///
<
param
name
=
"audioClip"
></
param
>
///
<
param
name
=
"bo"
>
true:为循环播放
</
param
>
public
void
PlayEffSound(
AudioClip audioClip,
bool bo)
{
audioEffect.
clip =
audioClip;
audioEffect.
Play();
audioEffect.
loop =
bo;
}
///
<
summary
>
/// 停止播放音效(当循环播放音效时可用)
///
</
summary
>
public
void
StopEffSound()
{
if (
audioEffect.
clip !=
null)
{
if (
audioEffect.
isPlaying ==
true)
{
audioEffect.
Stop();
}
else
{
Debug.
LogError(
"警告:当前音效未播放!");
}
}
else
{
Debug.
LogError(
"警告:当前未设置音效!");
}
}
///
<
summary
>
/// 播放音效(音乐播放完执行函数)
///
</
summary
>
///
<
param
name
=
"audioClip"
></
param
>
///
<
param
name
=
"action"
></
param
>
public
void
PlayEffSound(
AudioClip audioClip,
UnityAction action)
{
PlayEffSound(
audioClip);
StartCoroutine(
playOver(
audioClip.
length,
action));
}
///
<
summary
>
/// 获取本地音乐设置配置
///
</
summary
>
///
<
returns
></
returns
>
string
getMusicPrefs()
{
if (
PlayerPrefs.
HasKey(key:
music))
{
return
PlayerPrefs.
GetString(
music);
}
setPlayerPrefs(
music,
musicFirstSet);
return
musicFirstSet;
}
///
<
summary
>
/// 获取本地音效设置配置
///
</
summary
>
///
<
returns
></
returns
>
string
getSoundPrefs()
{
if (
PlayerPrefs.
HasKey(key:
sound))
{
return
PlayerPrefs.
GetString(
sound);
}
setPlayerPrefs(
sound,
musicFirstSet);
return
musicFirstSet;
}
///
<
summary
>
/// 本地音乐设置配置保存
///
</
summary
>
///
<
param
name
=
"str"
></
param
>
///
<
returns
></
returns
>
void
setMusicPrefs(
string str)
{
setPlayerPrefs(
music,
str);
}
///
<
summary
>
/// 本地音效设置配置保存
///
</
summary
>
///
<
returns
></
returns
>
void
setSoundPrefs(
string str)
{
setPlayerPrefs(
sound,
str);
}
///
<
summary
>
/// 保存声音设置到本地
///
</
summary
>
///
<
param
name
=
"str"
></
param
>
void
setPlayerPrefs(
string key,
string value)
{
PlayerPrefs.
SetString(
key,
value);
}
///
<
summary
>
/// 设置音量
///
</
summary
>
///
<
param
name
=
"audio"
></
param
>
///
<
param
name
=
"volume"
></
param
>
void
setVolume(
AudioSource audio,
float volume)
{
if (
volume <=
0)
{
audio.
mute =
true;
}
else
{
audio.
mute =
false;
audio.
volume =
volume;
}
}
GameObject _multiObjEffect;
GameObject multiObjEffect
{
get
{
if (
_multiObjEffect ==
null)
{
_multiObjEffect =
new
GameObject();
}
return
_multiObjEffect;
}
}
Dictionary<
AudioClip,
AudioSource> multiAudioDic =
new
Dictionary<
AudioClip,
AudioSource>();
///
<
summary
>
/// 多音乐同时播放(只能同时播四个音乐)
///
</
summary
>
///
<
param
name
=
"audio"
></
param
>
public
void
addMultiAudioEffect(
AudioClip audio)
{
if (
multiAudioDic.
ContainsKey(
audio) ==
false &&
multiAudioDic.
Count <
4)
{
AudioSource a =
multiObjEffect.
AddComponent<
AudioSource>();
if (!
SoundOnOff)
{
a.
mute =
true;
}
a.
loop =
false;
a.
clip =
audio;
a.
Play();
multiAudioDic.
Add(
audio,
a);
StartCoroutine(
playOver(
a.
clip.
length, () => {
Destroy(
a);
multiAudioDic.
Remove(
audio); }));
}
}
IEnumerator
playOver(
float time,
UnityAction action)
{
yield
return
new
WaitForSeconds(
time);
action();
}
}