unity3D一个简单的音乐管理类

/// 一个简单的音乐管理类,第一次有很多不足之处,希望大家可以指点出来。
/// 在一些小型项目中一般音乐分为背景音乐,按钮音乐和一些特效音乐,一般
/// 在设置音量和静音的开关时都会分为: 音乐 和 音效 两个选项,这里对音乐
/// 的控制其实就是背景音乐,而音效就是按钮跟一些特效的音乐。
/// 所以这里就需要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();
}
}

猜你喜欢

转载自blog.csdn.net/qq_36512517/article/details/80774327