/* ******************************************************************************** *Copyright(C),coolae.net *Author: chenbin *Version: 2.0 *Date: 2017-01-09 *Description: 播放音效工具,需要绑定到某个对像上 *Others: *History: ********************************************************************************* */ using UnityEngine; using System.Collections; namespace Coolape { public class SoundEx : MonoBehaviour { public static SoundEx self; //主音效,音乐audio public AudioSource mainAudio; //同时只能放一个音效 public AudioSource singletonAudio; public CLDelegate OnSwitchChangeCallbacks = new CLDelegate(); public SoundEx () { self = this; } /// /// Plaies the sound with callback.播放音效,带完成回调方法 /// /// /// Go. /// /// /// Clip. /// /// /// Volume. /// /// /// Callback. /// public static void PlaySoundWithCallback (AudioClip clip, float volume, object callback) { if (clip == null) return; NGUITools.PlaySound (clip, volume); self.StartCoroutine (DelayedCallback (clip, clip.length, callback)); } static IEnumerator DelayedCallback (AudioClip clip, float time, object callback) { string cName = ""; if (clip != null) { cName = clip.name; } yield return new WaitForSeconds (time); CLSoundPool.returnObj (cName); if (clip != null) { Utl.doCallback (callback, clip); } } static Hashtable playSoundCount = new Hashtable (); public static void playSound(string name) { playSound(name, 1, 1); } /// /// Plaies the sound.播放音效,可指定同时最大播放次数 /// /// /// Sound path. /// /// /// Volume. /// /// /// Max times.同时最大播放次数 /// public static void playSound (string name, float volume, int maxTimes = 1) { if (!soundEffectSwitch) return; if (self == null) { Debug.LogError ("Need Attack [SoundEx] to a gameObject"); return; } if (!string.IsNullOrEmpty (name)) { CLSoundPool.borrowObjAsyn (name, (Callback)onFinishSetAudio, maxTimes, null); // AudioClip clip = CLSoundPool.borrowObj (name); // if (clip != null) { // doPlaySound (clip, volume, maxTimes); // } else { // CLSoundPool.borrowObjAsyn (name, (Callback)onFinishSetAudio, maxTimes, null); // } } } public static void doPlaySound (AudioClip clip, float volume, int maxTimes = 1) { if (clip == null) return; try { if (playSoundCount [clip.name] == null || (int)(playSoundCount [clip.name]) < maxTimes) { playSoundCount [clip.name] = (playSoundCount [clip.name] == null ? 1 : (int)(playSoundCount [clip.name]) + 1); Callback cb = finishPlaySound; PlaySoundWithCallback (clip, volume, cb); } else { CLSoundPool.returnObj (clip.name); } } catch (System.Exception e) { Debug.LogError (e); } } public static void onFinishSetAudio (params object[] args) { if (args == null || args.Length == 0) return; AudioClip ac = ((AudioClip)args [1]); int maxTimes = (int)(args [2]); if (ac != null) { string name = ac.name; doPlaySound (ac, 1, maxTimes); } } //只能同时播一个音乐/音效 public static void playSoundSingleton (string name, float volume) { if (!soundEffectSwitch) return; if (self == null) { Debug.LogError ("Need Attack [SoundEx] to a gameObject"); return; } if (self.singletonAudio == null) { Debug.LogError ("singletonAudio is Null"); return; } try { self.singletonAudio.loop = false; if (self.singletonAudio.clip != null && self.singletonAudio.clip.name == name) { return; } self.singletonAudio.Stop (); if (!string.IsNullOrEmpty (name)) { CLSoundPool.borrowObjAsyn (name, (Callback)onFinishSetAudio4Singleton); } } catch (System.Exception e) { Debug.LogError (e); } } static void onFinishSetAudio4Singleton (params object[] args) { try { AudioClip ac = ((AudioClip)args [1]); if (ac != null) { string name = ac.name; self.singletonAudio.clip = ac; self.singletonAudio.volume = 1; self.singletonAudio.Play (); self.StartCoroutine (DelayedCallback (ac, ac.length, (Callback)onFinishPlayAudio4Singleton)); } } catch (System.Exception e) { Debug.LogError (e); } } static void onFinishPlayAudio4Singleton (params object[] args) { try { AudioClip ac = ((AudioClip)args [0]); if (ac == null) return; if (self.singletonAudio.clip != null && self.singletonAudio.clip.name == ac.name) { self.singletonAudio.clip = null; } } catch (System.Exception e) { Debug.LogError (e); } } public static void addCallbackOnSoundEffectSwitch(object callback) { self.OnSwitchChangeCallbacks.add("soundEffectSwitch", callback, null); } public static void removeCallbackOnSoundEffectSwitch(object callback) { self.OnSwitchChangeCallbacks.remove("soundEffectSwitch", callback); } public static void addCallbackOnMusicBgSwitch(object callback) { self.OnSwitchChangeCallbacks.add("musicBgSwitch", callback, null); } public static void removeCallbackOnMusicBgSwitch(object callback) { self.OnSwitchChangeCallbacks.remove("musicBgSwitch", callback); } public static void clean() { self.OnSwitchChangeCallbacks.removeDelegates("soundEffectSwitch"); self.OnSwitchChangeCallbacks.removeDelegates("musicBgSwitch"); } public static bool soundEffectSwitch { get { int f = PlayerPrefs.GetInt ("soundEffectSwitch", 0); return f == 0 ? true : false; } set { int oldVal = PlayerPrefs.GetInt("soundEffectSwitch", 0); int f = value ? 0 : 1; PlayerPrefs.SetInt ("soundEffectSwitch", f); if(oldVal != f) { ArrayList list = self.OnSwitchChangeCallbacks.getDelegates("soundEffectSwitch"); NewList cell = null; for (int i = 0; i < list.Count; i++) { cell = list[i] as NewList; if (cell != null && cell.Count > 0) { Utl.doCallback(cell[0], value); } } } } } public static bool musicBgSwitch { get { int f = PlayerPrefs.GetInt ("musicBgSwitch", 0); return f == 0 ? true : false; } set { int oldVal = PlayerPrefs.GetInt("musicBgSwitch", 0); int f = value ? 0 : 1; PlayerPrefs.SetInt ("musicBgSwitch", f); if(oldVal != f) { ArrayList list = self.OnSwitchChangeCallbacks.getDelegates("musicBgSwitch"); NewList cell= null; for (int i = 0; i < list.Count; i++) { cell = list[i] as NewList; if (cell != null && cell.Count > 0) { Utl.doCallback(cell[0], value); } } } } } public static void playSound (AudioClip clip, float volume, int maxTimes = 1) { if (!soundEffectSwitch) return; if (self == null) { Debug.LogError ("Need Attack [SoundEx] to a gameObject"); return; } if (clip == null) return; if (playSoundCount [clip.name] == null || (int)(playSoundCount [clip.name]) < maxTimes) { playSoundCount [clip.name] = (playSoundCount [clip.name] == null ? 1 : (int)(playSoundCount [clip.name]) + 1); Callback cb = finishPlaySound; PlaySoundWithCallback (clip, volume, cb); } } public static void playSound2 (string clipName, float volume) { AudioClip clip = Resources.Load (clipName) as AudioClip; NGUITools.PlaySound (clip, volume); } static void finishPlaySound (params object[] obj) { AudioClip clip = (AudioClip)(obj [0]); if (clip != null) { playSoundCount [clip.name] = (playSoundCount [clip.name] == null ? 0 : (int)(playSoundCount [clip.name])) - 1; playSoundCount [clip.name] = (int)(playSoundCount [clip.name]) < 0 ? 0 : playSoundCount [clip.name]; //Resources.UnloadAsset(clip); } } // -- 播放背景音乐--------------- public static AudioClip mainClip; public static void onGetMainMusic (params object[] args) { string path = (string)(args [0]); mainClip = (AudioClip)(args [1]); if (mainClip == null) { return; } doPlayMainMusic (mainClip); } public static void stopMainMusic () { if (self == null) { Debug.LogError ("Need Attack [SoundEx] to a gameObject"); return; } if (self.mainAudio.isPlaying) { self.mainAudio.Pause (); } if (self.mainAudio.clip != null) { CLSoundPool.returnObj (self.mainAudio.clip.name); self.mainAudio.clip = null; } } public static void doPlayMainMusic (AudioClip clip) { try { if (self.mainAudio.clip != clip) { if (self.mainAudio.clip != null) { CLSoundPool.returnObj (self.mainAudio.clip.name); } self.mainAudio.Stop (); self.mainAudio.clip = clip; self.mainAudio.Play (); } else { if (!self.mainAudio.isPlaying) { self.mainAudio.Play (); } } } catch (System.Exception e) { Debug.LogError (e); } } public static void playMainMusic (string soundName) { if (self == null) { Debug.LogError ("Need Attack [SoundEx] to a gameObject"); return; } if (self.mainAudio.clip != null && self.mainAudio.clip.name == soundName) { if (SoundEx.musicBgSwitch) { if (!self.mainAudio.isPlaying) { self.mainAudio.Play (); } } else { self.mainAudio.Pause (); } return; } if (SoundEx.musicBgSwitch) { CLSoundPool.borrowObjAsyn (soundName, (Callback)onGetMainMusic); } } } }