public enum AudioType
{
BackgroundMusic,
TY_Click,
Jump,
}
首先我們定義三種音效,….反正嘛,,,自己push進去幾種…
新建一個 AudioManager 類,這個類切換場景我們保持不銷燬,因為遊戲所有場景都會有聲音的存在…嗷嗚~~嗷嗚~~嗷嗚~~
遊戲中,一般我們播放一種背景音樂。以及 多種點擊多個button產生的不同點擊音效…等等
在遊戲設置中,我們可以設置音效大小以及關閉 (關閉==零嘛)
private static AudioManager audioManager;
public static AudioManager Instance { get { return audioManager; } }
//播放聲音的組件…都懂的
private AudioSource audioSource;
//聲音的類型,以及路徑。這個類型如果覺得一個Type不夠,自己可以按需求加。
private Dictionary<AudioType, string> audioPathDict;
//緩存音頻文件,下次可以直接用,不需要再加載
private Dictionary<AudioType, AudioClip> audioClipDic;
//緩存池,音頻組件
private List<AudioSource> CacheList;
//使用中的,音頻組件
private List<AudioSource> UseList;
//音樂的音量
private float musicVolume = 1;
//音效的音量
private float soundVolume = 1;
//音樂音量 用於本地讀取PlayerPrefs
private string musicVolumePrefs = “MusicVolume”;
//音效音效 用於本地讀取PlayerPrefs
private string soundVolumePrefs = “SoundVolume”;
//音頻組件緩存池最大長度
private int CacheMaxCount = 10;
void Awake()
{
DontDestroyOnLoad(this.gameObject);
audioManager = this;
//可以使用xml或者json直接讀取,這邊測試,直接寫死
audioPathDict = new Dictionary<AudioType, string>()
{
{ AudioType.BackgroundMusic, “AudioClip/Music/MainMenuScene” },
{ AudioType.TY_Click, “AudioClip/Sound/Sound1”},
{ AudioType.Jump, “AudioClip/Sound/Sound2”},
};
audioSource = gameObject.AddComponent<AudioSource>();
CacheList = new List<AudioSource>();
UseList = new List<AudioSource>();
audioClipDic = new Dictionary<AudioType, AudioClip>();
}
void Start()
{
// 從本地緩存讀取聲音音量
if (PlayerPrefs.HasKey(musicVolumePrefs))
{
musicVolume = PlayerPrefs.GetFloat(musicVolumePrefs);
}
if (PlayerPrefs.HasKey(soundVolumePrefs))
{
musicVolume = PlayerPrefs.GetFloat(soundVolumePrefs);
}
}
/// <summary>
/// 播放背景音樂
/// </summary>
/// <param name=”id“></param>
/// <param name=”loop“></param>
public void PlayMusic(AudioType type, bool loop = true)
{
audioSource.clip = GetAudioClip(type);
audioSource.clip.LoadAudioData();
audioSource.loop = loop;
audioSource.volume = musicVolume;
audioSource.Play();
}
/// <summary>
/// 播放音效
/// </summary>
/// <param name=”id“></param>
public void PlaySound(AudioType type)
{
//當緩存池沒有的時候,新建
if (CacheList.Count != 0)
{
AudioSource audioSource = UnusedToUsed();
audioSource.clip = GetAudioClip(type);
audioSource.clip.LoadAudioData();
audioSource.Play();
StartCoroutine(WaitPlayOver(audioSource));
}
else
{
AddAudioSource();
AudioSource audioSource = UnusedToUsed();
audioSource.clip = GetAudioClip(type);
audioSource.clip.LoadAudioData();
audioSource.volume = soundVolume;
audioSource.loop = false;
audioSource.Play();
StartCoroutine(WaitPlayOver(audioSource));
}
}
/// <summary>
/// 當播放音效結束後,將其移至未使用集合
/// </summary>
/// <param name=”audioSource“></param>
/// <returns></returns>
IEnumerator WaitPlayOver(AudioSource audioSource)
{
//等待音樂播放完畢
yield return new WaitUntil(() => { return !audioSource.isPlaying; });
//加入緩存
UsedToUnused(audioSource);
}
/// <summary>
/// 獲取音頻文件,獲取後會緩存一份
/// </summary>
/// <param name=”id“></param>
/// <returns></returns>
private AudioClip GetAudioClip(AudioType type)
{
if (!audioClipDic.ContainsKey(type))
{
if (!audioPathDict.ContainsKey(type))
return null;
AudioClip ac = Resources.Load(audioPathDict[type]) as AudioClip;
audioClipDic.Add(type, ac);
}
return audioClipDic[type];
}
/// <summary>
/// 添加音頻組件
/// </summary>
/// <returns></returns>
private AudioSource AddAudioSource()
{
if (CacheList.Count != 0)
{
return UnusedToUsed();
}
else
{
AudioSource audioSource = gameObject.AddComponent<AudioSource>();
CacheList.Add(audioSource);
return audioSource;
}
}
/// <summary>
/// 從對象池取出未使用的音頻
/// </summary>
/// <returns></returns>
private AudioSource UnusedToUsed()
{
AudioSource audioSource = CacheList[0];
CacheList.RemoveAt(0);
UseList.Add(audioSource);
return audioSource;
}
/// <summary>
/// 使用音頻結束後加入緩存池
/// </summary>
/// <param name=”audioSource“></param>
private void UsedToUnused(AudioSource audioSource)
{
UseList.Remove(audioSource);
if (CacheList.Count >= CacheMaxCount)
{
Destroy(audioSource);
}
else
{
CacheList.Add(audioSource);
}
}
/// <summary>
/// 修改音樂音量
/// </summary>
/// <param name=”volume“></param>
public void ChangeMusicVolume(float volume)
{
musicVolume = volume;
audioSource.volume = volume;
PlayerPrefs.SetFloat(musicVolumePrefs, volume);
}
/// <summary>
/// 修改音效音量
/// </summary>
/// <param name=”volume“></param>
public void ChangeSoundVolume(float volume)
{
soundVolume = volume;
for (int i = 0; i < CacheList.Count; i++)
{
CacheList[i].volume = volume;
}
for (int i = 0; i < UseList.Count; i++)
{
UseList[i].volume = volume;
}