一:目标
游戏音频的播放在任何游戏中都占据十分重要的位置,音频的播放能够分为两种,一种为游戏音乐,另一种为游戏音效。前者实用于较长的音乐,如游戏背景音乐。第二种实用于比拟短的游戏音乐,如开枪霎时的音效
在Unity中有两个对于音频的重要组件:AudioListener和AudioSource,通过AudioListener进行监听,AudioSource进行播放
所以咱们须要一个管理器对立治理音频的相干操作
二:解决的问题及长处
——音效的播放、暂停、持续、静音
——背景音乐的播放、暂停、持续、静音、渐隐
三:应用办法
——将所有音频文件对立放在Resources文件夹下的Sounds文件夹下
——应用SoundMgr.Ins.XXX
SoundMgr.Ins.PlayBGM("bgm");
SoundMgr.Ins.PlaySound("coin");
SoundMgr.Ins.StopPlay();
SoundMgr.Ins.PausePlay();
SoundMgr.Ins.BGMFade(2);
四:代码实现
using UnityEngine;
/// <summary>
/// 音频管理器
/// </summary>
public class SoundMgr : MonoSingleton<SoundMgr>
{
public const string SoundDir = "Sounds/";//音频目录
//BGM播放器
private AudioSource bgmPlayer;
public AudioSource BgmPlayer { get { return bgmPlayer; } }
//音效播放器
private AudioSource soundPlayer;
public AudioSource SoundPlayer { get { return soundPlayer; } }
//是否静音
private bool isMute;
public bool IsMute { get { return isMute; } }
private bool bgmFade;//背景音乐是否渐隐
private float bgmFadeBeginVolume;//背景音乐渐隐开始时的音量
private float bgmFadeBeginTime;//背景音乐渐隐开始的工夫
private float bgmFadeDuration;//背景音乐渐隐的工夫
private void Awake()
{
if (bgmPlayer == null)
{
bgmPlayer = gameObject.AddComponent<AudioSource>();
bgmPlayer.loop = true;
bgmPlayer.playOnAwake = false;
bgmPlayer.mute = isMute;
}
if (soundPlayer == null)
{
soundPlayer = gameObject.AddComponent<AudioSource>();
soundPlayer.loop = false;
soundPlayer.playOnAwake = false;
soundPlayer.mute = isMute;
}
}
/// <summary>
/// 播放音效
/// </summary>
public void PlaySound(string soundName, float volume = 1, bool loop = false)
{
AudioClip clip = Resources.Load<AudioClip>(SoundDir + soundName);
if (clip == null)
{
Debug.LogError("没有此音频:" + soundName);
return;
}
soundPlayer.clip = clip;
soundPlayer.volume = volume;
soundPlayer.loop = loop;
soundPlayer.Play();
}
/// <summary>
/// 播放背景音乐
/// </summary>
public void PlayBGM(string bgmName, float volume = 1, bool loop = true)
{
AudioClip clip = Resources.Load<AudioClip>(SoundDir + bgmName);
if (clip == null)
{
Debug.LogError("没有此音频:" + bgmName);
return;
}
bgmPlayer.clip = clip;
bgmPlayer.volume = volume;
bgmPlayer.loop = loop;
bgmPlayer.Play();
}
/// <summary>
/// 背景音乐渐隐
/// </summary>
public void FadeBGM(float fadeDuration)
{
bgmFade = true;
bgmFadeBeginTime = Time.realtimeSinceStartup;
bgmFadeBeginVolume = bgmPlayer.volume;
bgmFadeDuration = fadeDuration;
}
/// <summary>
/// 暂停播放
/// </summary>
public void PausePlay()
{
bgmPlayer.Pause();
soundPlayer.Pause();
}
/// <summary>
/// 持续播放
/// </summary>
public void ResumePlay()
{
bgmPlayer.Play();
soundPlayer.Play();
}
/// <summary>
/// 进行播放
/// </summary>
public void StopPlay()
{
bgmPlayer.Stop();
soundPlayer.Stop();
}
/// <summary>
/// 设置静音
/// </summary>
public void SetMute(bool b)
{
isMute = b;
bgmPlayer.mute = isMute;
soundPlayer.mute = isMute;
}
/// <summary>
/// 进行播放BGM
/// </summary>
public void StopPlayBGM()
{
bgmPlayer.Stop();
}
/// <summary>
/// 暂停播放BGM
/// </summary>
public void PausePlayBGM()
{
bgmPlayer.Pause();
}
/// <summary>
/// 持续播放BGM
/// </summary>
public void ResumePlayBGM()
{
bgmPlayer.Play();
}
/// <summary>
/// 进行播放音效
/// </summary>
public void StopPlaySound()
{
soundPlayer.Stop();
}
private void Update()
{
if (bgmFade)
{
float delta = Time.realtimeSinceStartup - bgmFadeBeginTime;
if (delta <= bgmFadeDuration)
{
bgmPlayer.volume = Mathf.Lerp(bgmFadeBeginVolume, 0, delta / bgmFadeDuration);
}
else
{
bgmFade = false;
bgmPlayer.volume = 0;
}
}
}
}
图片起源:http://www.coubai.com/ 页游
发表回复