using System.Collections; using System.Collections.Generic; using UnityEngine; public enum AudioEnum { BGM1, BGM2, UI,//UI按键 UIDisable,//UI不可点击_错误 BuffAppear,//翻书 ChooseBuff,//选择buff后 End,//游戏结束 BossDie,//BOSS死亡 AttackTower,//敌人攻击塔 DragTower,//拖动宝石时 PutTower,//放下宝石 FireTAttack,//火攻击 WaterTAttack,//水攻击 WoodTAttack,//木攻击 LightningSkill,//电技能 FireSkill//火技能 } public class AudioSourceManager : MonoBehaviour { private static AudioSourceManager _ins; public static AudioSourceManager Ins { get { return _ins; } } private void Awake() { _ins = this; clipDic = new Dictionary(); audioSourceList = new List(); for (int i = 0; i < 5; i++) { audioSourceList.Add(gameObject.AddComponent()); } } private AudioSource audioSource; private List audioSourceList = new List(); /// /// 跳过第一个,第一个用来播放背景音 获取一个空的组件 /// /// private AudioSource GetAudioSource() { for (int i = 1; i < audioSourceList.Count; i++) { if (!audioSourceList[i].isPlaying) { return audioSourceList[i]; } } AudioSource tmpAudioSource = gameObject.AddComponent(); audioSourceList.Add(tmpAudioSource); return tmpAudioSource; } private AudioClip LoadAudioClip(string musicName) { if (clipDic.ContainsKey(musicName)) return clipDic[musicName]; else { AudioClip au = Resources.Load("Music/" + musicName); clipDic.Add(musicName, au); return au; } } public void Play(AudioEnum en) { // Debug.Log("播放了音效:"+en); switch (en) { case AudioEnum.BGM1: Play("BGM1", false); break; case AudioEnum.BGM2: Play("BGM2", false); break; case AudioEnum.UI: Play("UI按键", true); break; case AudioEnum.UIDisable: Play("不可点击_错误", true); break; case AudioEnum.BuffAppear: Play("翻书", true); break; case AudioEnum.ChooseBuff: StopOneShot("选择buff后", true); //Play("选择buff后", true); break; case AudioEnum.End: Play("游戏结束", true); break; case AudioEnum.BossDie: Play("BOSS死亡", true); break; case AudioEnum.AttackTower: Play("敌人攻击塔", true); break; case AudioEnum.DragTower: Play("拖动宝石时", true); break; case AudioEnum.PutTower: Play("放下宝石", true); break; case AudioEnum.FireTAttack: Play("火攻击", true, 0.5f); break; case AudioEnum.WaterTAttack: Play("水攻击", true, 0.5f); break; case AudioEnum.WoodTAttack: Play("木攻击", true, 0.5f); break; case AudioEnum.LightningSkill: Play("电技能", true); break; case AudioEnum.FireSkill: Play("火技能", true); break; } } Dictionary clipDic; private void Play(string musicName, bool isOneShot, float volume = 1.0f) { AudioClip au = LoadAudioClip(musicName); AudioSource tmpAudioSource; //tmpAudioSource.volume = PlayerPrefs.GetFloat("BgmVal"); if (isOneShot) { tmpAudioSource = GetAudioSource(); tmpAudioSource.clip = au; tmpAudioSource.loop = false; //tmpAudioSource.PlayOneShot(au);//无法立刻暂停 StartCoroutine(RemoAudio(tmpAudioSource, au)); } else { tmpAudioSource = audioSourceList[0]; tmpAudioSource.clip = null; tmpAudioSource.clip = au; tmpAudioSource.loop = true; } tmpAudioSource.Play(); tmpAudioSource.volume = volume; } /// /// 销毁音效 /// /// private IEnumerator RemoAudio(AudioSource tmpAudioSource, AudioClip au) { if (audioSourceList.Count > 5) { yield return new WaitForSeconds(au.length); audioSourceList.Remove(tmpAudioSource); Destroy(tmpAudioSource); } yield break; } /// /// 调整音效时更新音量 /// public void UpdateAudioVal() { foreach (AudioSource val in audioSourceList) { //便利所有的Bgm ,设置音量 if (val) { val.volume = PlayerPrefs.GetFloat("BgmVal"); } } } /// /// 删除指定音效 /// /// 被删除的音乐 public void DeleteAudio(string audioName) { foreach (AudioSource val in audioSourceList) { if (val && val.clip.name == audioName) { audioSourceList.Remove(val); Destroy(val.gameObject); break; } } } /// /// 音乐暂停 /// /// 是否暂停 public void StopAudio(bool isStop) { foreach (AudioSource val in audioSourceList) { if (isStop && val) { val.Pause(); } else if (val) { val.Play(); } } } /// /// 判断当前音乐是否存在 /// /// 音乐名字 /// private bool AudioIsTrue(string audioName) { foreach (AudioSource val in audioSourceList) { if (val && val.clip.name == audioName) { return true; } } return false; } /// /// 停止播放某一个音效 /// /// private void StopOneShot(string musicName, bool isOneShot) { foreach (AudioSource val in audioSourceList) { if (val && val.clip && val.clip.name == musicName) { val.Stop(); val.clip = null; break; } } Play(musicName, isOneShot); } }