播放背景音乐、播放提示音、播放音效。成组播放、声音源复用、音量控制、音效播放位置等等。
写差不多了,发现不是自己想要的风格。没完善呢就过时的感觉。先放着吧。。。
#if UNITY_EDITOR
//#define Sirenix_OdinInspector
#endif
#if Sirenix_OdinInspector
using Sirenix.OdinInspector;
#endif
using System.Collections.Generic;
using UnityEngine;
using Random = UnityEngine.Random;
/// <summary>
/// 声音管理器
/// (目前不保证稳定,出现问题可尝试"try{}catch{AudioManager.ForceReset();}")
/// </summary>
public class AudioManager :
#if Sirenix_OdinInspector
SerializedMonoBehaviour
#else
MonoBehaviour
#endif
{
public static AudioManager Instance
{
get
{
CreatAudioManager();
return instance;
}
}
#if Sirenix_OdinInspector
#elif UNITY_EDITOR
[Header("注意!不要在面板上修改任何值!面板仅为方便观察"),Space(10)]
#endif
public const int ID_WHEN_NULL = -1;
#region 设置项
/// <summary>
/// 读取默认配置
/// </summary>
private void LoadConfig()
{
MuteSound = PlayerPrefs.GetInt("MuteSound") > 0 ? true : false;
SoundVolume = PlayerPrefs.GetFloat("SoundVolume");
MuteMusic = PlayerPrefs.GetInt("MuteMusic") > 0 ? true : false;
MusicVolume = PlayerPrefs.GetFloat("MuteSound");
}
private void SaveConfig()
{
PlayerPrefs.SetInt("MuteSound", MuteSound ? 1 : 0);
PlayerPrefs.SetFloat("SoundVolume", SoundVolume);
PlayerPrefs.SetInt("MuteSound", MuteMusic ? 1 : 0);
PlayerPrefs.SetFloat("MuteSound", MusicVolume);
PlayerPrefs.Save();
}
/// <summary>
/// 音效静音
/// </summary>
public bool MuteSound
{
get
{
return muteSound;
}
set
{
if (muteSound == value)
return;
needSave = true;
saveTime = 0;
muteSound = value;
if (!muteSound)
return;
for (int i = 0; i < playingAudio.Count; i++)
{
if (playingAudio != null
&& !playingAudio[i].IsMusic)
{
playingAudio[i].Stop(0, true);
}
}
}
}
/// <summary>
/// 音效音量
/// </summary>
public float SoundVolume
{
get
{
return soundVolume;
}
set
{
if (soundVolume == value)
return;
needSave = true;
saveTime = 0;
soundVolume = value;
}
}
/// <summary>
/// 背景音乐静音
/// </summary>
public bool MuteMusic
{
get
{
return muteMusic;
}
set
{
if (muteMusic == value)
return;
needSave = true;
saveTime = 0;
muteMusic = value;
if (!muteMusic)
return;
for (int i = 0; i < playingAudio.Count; i++)
{
if (playingAudio != null
&& playingAudio[i].IsMusic)
{
playingAudio[i].Stop(2, false);
}
}
}
}
/// <summary>
/// 背景音乐声音大小
/// </summary>
public float MusicVolume
{
get
{
return musicVolume;
}
set
{
if (musicVolume == value)
return;
needSave = true;
saveTime = 0;
musicVolume = value;
}
}
#endregion 设置项
#region 全局工具
public void Init()
{
idPointer = 0;
AudioControllerDic.Clear();
LoadConfig();
OnInit();
//PerLoad();
}
/// <summary>
/// 重置
/// </summary>
public void ForceReset()
{
while (sourceCachePool.Count > 0)
{
sourceCachePool.Dequeue().Release();
}
playingMusic = null;
playingBGSound = null;
for (int i = 0; i < playingAudio.Count; i++)
{
if (playingAudio[i] != null)
playingAudio[i].Release();
}
playingAudio.Clear();
audioClipPool.Clear();
poolTotalCount = 0;
audioTotalCount = 0;
recordTimes = 0;
lastRecordTime = 0;
Init();
}
/// <summary>
/// 停止所有声音
/// </summary>
public void StopAll()
{
for (int i = 0; i < playingAudio.Count; i++)
{
if (playingAudio[i] != null)
{
playingAudio[i].Stop(1, false);
}
}
}
/// <summary>
/// 让某声音控制器停止播放
/// </summary>
/// <param name="id">声音控制器ID</param>
/// <param name="transitionTime">过渡时间</param>
/// <param name="waitFinished">是否等待播放完成</param>
public void StopAudio(int id, float transitionTime = 0, bool waitFinished = false)
{
if (id == ID_WHEN_NULL)
return;
if (!AudioControllerDic.ContainsKey(id))
return;
if (AudioControllerDic[id] == null)
return;
AudioControllerDic[id].Stop(transitionTime, waitFinished);
}
#endregion 全局工具
#region 背景音乐相关接口
/// <summary>
/// 播放背景音乐
/// </summary>
/// <param name="clipName">音频文件名</param>
/// <param name="transitionTime">过渡时间</param>
/// <returns>声音控制器ID</returns>
public int PlayBackGroundMusic(string clipName, float transitionTime = 1)
{
if (MuteMusic)
return ID_WHEN_NULL;
if (clipName == null)
return ID_WHEN_NULL;
if (IsPlayingBGM(clipName))
return playingMusic.ID;
if (transitionTime < 0)
transitionTime = 0;
if (playingMusic != null)
playingMusic.Stop(transitionTime, false);
playingMusic = GetController();
playingMusic.SetMusic(transitionTime, false, true, GetClip(clipName));
return playingMusic.ID;
}
/// <summary>
/// 是否正在播放
/// </summary>
/// <returns></returns>
public bool IsPlayingBGM()
{
if (MuteMusic)
return false;
if (playingMusic == null)
return false;
return playingMusic.IsPlaying();
}
/// <summary>
/// 是否正在播放背景音乐
/// </summary>
/// <returns></returns>
public bool IsPlayingBGM(string clipName)
{
if (MuteMusic)
return false;
if (playingMusic == null)
return false;
return playingMusic.IsPlaying(clipName);
}
/// <summary>
/// 停止播放
/// </summary>
/// <param name="waitEnd">是否等待播放完成再停止</param>
public void StopBGM(bool waitEnd = false)
{
if (playingMusic == null)
return;
playingMusic.Stop(2, waitEnd);
}
/// <summary>
/// 得到当前正在播放的背景音乐
/// </summary>
/// <returns></returns>
public string GetCurrBGM()
{
if (MuteMusic)
return null;
if (playingMusic == null)
return null;
if (!playingMusic.IsPlaying())
return null;
if (playingMusic.audioClips == null)
return null;
if (playingMusic.CurrIdex >= playingMusic.audioClips.Length)
return playingMusic.audioClips[0].name;
return playingMusic.audioClips[playingMusic.CurrIdex].name;
}
/// <summary>
/// 加入背景音乐播放队列
/// </summary>
/// &