今天晚了LOL, 發現里面的聲音系統做得很不錯,於是最近就寫了一份反正以后也用的到,2D音樂全局播放.
項目跟PoolManager對象池插件結合了.
解決的問題:
1. 已經播放的聲音,可以馬上暫停或者減少音量等等
2. 實現音樂全局控制
3. 音樂和音效分開控制
4. 音樂重疊播放
類如下:
AudioShot 音樂實體類
SoundController 全局音樂控制類
SoundPanel 音樂面板
代碼如下:
AudioShot實體類:
using UnityEngine; using System.Collections; public class AudioShot : MonoBehaviour { public AudioSource audioSource; public string audioName; }
SoundController類:
using UnityEngine; using System.Collections; using PathologicalGames; using System.Collections.Generic; /* * 2D音樂播放全局控制類 * 如果有音樂已經在播放了,改變聲音大小,或者停止播放 * 可控制已經在播放的音樂馬上暫停,或改變當前的音量 */ public class SoundController : MonoBehaviour { private float fxVolume = 1; //音效聲音大小 private float musicVolume = 1; //音樂聲音大小 private bool isPlayFxVolume = true; //是否播放音效聲音 private bool isPlayMusicVolume = true; //是否播放音樂聲音 public AudioClip[] fxClip; public AudioClip[] musicClip; private SpawnPool audioSpwan; //音樂游戲物體池 private List<AudioSource> fxAudioList; //為了控制已經播放的音樂,需要記錄他們的引用 private List<AudioSource> musicAudioList; public static SoundController instance; private int audioCount; //音樂下標值計時器 public void Awake() { audioSpwan = PoolManager.Pools["Audio"]; fxAudioList = new List<AudioSource>(); musicAudioList = new List<AudioSource>(); instance = this; } /// <summary> /// 播放音效不可重疊播放 /// </summary> /// <param name="name"></param> public void PlayFxSound(string name) { if (isPlayFxVolume) { for (int i = 0; i < fxClip.Length; i++) { if (name == fxClip[i].name) { audio.PlayOneShot(fxClip[i], fxVolume); return; } } } } /// <summary> /// 播放音效可重疊播放(NGUI播放方式,只能一次播放完整才能銷毀,最好不要使用) /// </summary> /// <param name="name"></param> public void PlayFxSoundOverlap(string name) { if (fxClip == null) return; if (isPlayFxVolume) { for (int i = 0; i < fxClip.Length; i++) { if (name == fxClip[i].name) { //NGUITools.PlaySound(fxClipStatic[i], fxVolume); var gameObject = audioSpwan.Spawn("AudioShotGame"); gameObject.audio.clip = fxClip[i]; gameObject.audio.volume = fxVolume; gameObject.audio.Play(); AudioShot model = gameObject.GetComponent<AudioShot>(); if (string.IsNullOrEmpty(model.audioName)) { model.name = audioCount + ""; audioCount++; fxAudioList.Add(gameObject.audio); //添加到集合中 } return; } } } } /// <summary> /// 播放音樂 /// </summary> /// <param name="name"></param> public void PlayMusicSound(string name) { if(isPlayMusicVolume) { for (int i = 0; i < musicClip.Length; i++) { if (name == musicClip[i].name) { audio.PlayOneShot(musicClip[i], musicVolume); return; } } } } public void PlayMusicSoundOverlap(string name) { if (musicClip == null) return; if(isPlayMusicVolume) { for (int i = 0; i < musicClip.Length; i++) { if (name == musicClip[i].name) { var gameObject = audioSpwan.Spawn("AudioShotGame"); gameObject.audio.clip = musicClip[i]; gameObject.audio.volume = musicVolume; gameObject.audio.Play(); AudioShot model = gameObject.GetComponent<AudioShot>(); if (string.IsNullOrEmpty(model.audioName)) { model.audioName = audioCount + ""; audioCount++; //添加到集合中 musicAudioList.Add(gameObject.audio); } return; } } } } public void UpdateFxVolume(float volume) { this.fxVolume = volume; foreach (var i in fxAudioList) { i.volume = volume; } } public void UpdateMusicVolume(float volume) { this.musicVolume = volume; foreach (var i in musicAudioList) { i.volume = volume; } } public void IsPlayFxVolume(bool isPlay) { isPlayFxVolume = isPlay; if (isPlay == false) { foreach (var i in fxAudioList) { i.volume = 0; } } else { foreach (var i in fxAudioList) { i.volume = fxVolume; } } } public void IsPlayMusicVolume(bool isPlay) { isPlayMusicVolume = isPlay; if (isPlay == false) { foreach (var i in musicAudioList) { i.volume = 0; } } else { foreach (var i in musicAudioList) { i.volume = musicVolume; } } } public void ClearAudioSource() { for (int i = 0; i < musicAudioList.Count; i++) { if (musicAudioList[i].isPlaying == false) { musicAudioList.Remove(musicAudioList[i]); } } for (int i = 0; i < fxAudioList.Count; i++) { if (fxAudioList[i].isPlaying == false) { fxAudioList.Remove(fxAudioList[i]); } } } }
音樂控制面板類:
using UnityEngine; using System.Collections; public class SoundPanel : MonoBehaviour { public void UpdateFxVolume(float i) { SoundController.instance.UpdateFxVolume(i); } public void UpdateMusicVolume(float i) { SoundController.instance.UpdateMusicVolume(i); } public void isPlayFxSound(bool isOpen) { SoundController.instance.IsPlayFxVolume(isOpen); } public void isPlayMusicSound(bool isOpen) { SoundController.instance.IsPlayMusicVolume(isOpen); } public void PlayMusic() { SoundController.instance.PlayMusicSoundOverlap("3550"); } public void PlayFx() { SoundController.instance.PlayFxSoundOverlap("1843"); } }
源代碼地址: http://yunpan.cn/cKSQeasSgVXbD 提取碼 dedb