Unity实现音频播放管理器
本文实例为大家分享了Unity实现音频播放管理器的具体代码,供大家参考,具体内容如下
1、模块化,直接用。创建一个空物体,把此脚本拖上去,然后把需要播放的所有音频拖到面板上的”AudioList“中;
2、通过AudioManagerP._instance直接调用方法,包含:
- 暂停;
- 继续播放;
- 停止播放;
- 播放背景音乐(0号播放器专用于播放背景音);
- 直接播放声音(带参数1、播放器序号 2、音频的名字 3、声音大小 4、 是否循环);
- 直接播放呻吟(带参数1、播放器序号 2、音频的名字);
- 声音淡入(带参数1、播放器序号 2、音频的名字 3、是否循环);
- 声音淡出(带参数 播放器序号)。
优点:同时可以播放很多个声音源,可以精确控制每个播放源的状态
缺点:不知道。
源码
usingSystem.Collections; usingSystem.Collections.Generic; usingUnityEngine; publicclassAudioManagerP:MonoBehaviour { publicstaticAudioManagerP_instance;//单例 privateboolisOut; privateboolisIn; voidAwake() { _instance=this; DontDestroyOnLoad(this); } //audioClipl列表 publicListaudioList; //初始声音预设数量 privateintinitAudioPrefabcount=7; //记录静音前的音量大小 [HideInInspector] publicfloattempVolume=0; //是否静音 privateboolisMute=false; publicboolIsMute { set { isMute=value; if(isMute) { tempVolume=AudioListener.volume; AudioListener.volume=0; } else { AudioListener.volume=tempVolume; } } privateget{returnisMute;} } //声音大小系数 privatefloatvolumeScale=1; publicfloatVolumeScale { set { volumeScale=Mathf.Clamp01(value); if(!IsMute) { AudioListener.volume=value; } } privateget{returnvolumeScale;} } //audio字典 privateDictionary audioDic=newDictionary (); //背景音乐 privateAudioSourcebgAudioSource; //声音对象池 privateAudioObjectPoolaudioObjectPool; privatevoidStart() { GameObjectaudioPrefab=newGameObject("AudioObjectPool"); audioPrefab.AddComponent (); audioPrefab.GetComponent ().playOnAwake=false; audioObjectPool=newAudioObjectPool(audioPrefab,initAudioPrefabcount); audioPrefab.hideFlags=HideFlags.HideInHierarchy; audioPrefab.transform.SetParent(this.transform); foreach(AudioClipacinaudioList) { audioDic.Add(ac.name,ac); } bgAudioSource=this.transform.GetChild(0).GetComponent (); } privatevoidUpdate() { //测试代码 if(Input.GetMouseButtonDown(0)) { //StartCoroutine(AudioFadeIn(0,"沈木-SoldOut(热播版)",true));//音乐渐入 //PlayAudio(0,"沈木-SoldOut(热播版)");//直接播放 } if(Input.GetMouseButtonDown(1)) { //StartCoroutine(AudioFadedOut(0));//音乐淡出 } } /// ///音频播放 /// ///播放器序号(用第几个AudioSource播放) publicvoidPauseAudio(intindex) { AudioSourceaudioSource=this.transform.GetChild(index).GetComponent (); audioSource.Pause(); } /// ///继续播放 /// ///播放器序号 publicvoidResumeAudio(intindex) { AudioSourceaudioSource=this.transform.GetChild(index).GetComponent (); audioSource.UnPause(); } /// ///停止播放声音 /// ///播放器序号 publicvoidStopAudio(intindex) { AudioSourceaudioSource=this.transform.GetChild(index).GetComponent (); audioSource.Stop(); } /// ///播放背景音乐,这里直接固定0号播放器用来播放北京音乐 /// ///publicvoidPlayBGMAudio(stringaudioNme) { AudioClipaudioClip; if(audioDic.TryGetValue(audioNme,outaudioClip)) { bgAudioSource.gameObject.SetActive(true); bgAudioSource.clip=audioClip; this.transform.GetChild(0).gameObject.SetActive(true); bgAudioSource.Play(); bgAudioSource.loop=true; } } /// ///直接播放声音 /// ///播放器序号 /// 音频文件名称 /// 音量大小 /// 是否循环 publicvoidPlayAudio(intindex,stringaudioName,floatvolume=1,boolisLoop=false) { //Debug.Log("------------执行播放声音----------------"); AudioSourceaudioSource=this.transform.GetChild(index).GetComponent (); if(IsMute||audioSource==null) { return; } StopAllCoroutines(); AudioClipaudioClip; if(audioDic.TryGetValue(audioName,outaudioClip)) { //Debug.Log("按钮点击的clip名字是:"+audioClip.name); audioSource.gameObject.SetActive(true); audioSource.loop=isLoop; audioSource.clip=audioClip; audioSource.volume=volume; if(audioSource.isPlaying) { audioSource.Stop(); } audioSource.Play(); } } /// ///重载播放,只有播放器和音频 /// ///播放器序号 /// 音频的名称 publicvoidPlayAudio(intindex,stringaudioName) { //Debug.Log("------------执行播放声音----------------"); AudioSourceaudioSource=this.transform.GetChild(index).GetComponent (); if(IsMute||audioSource==null) { return; } StopAllCoroutines(); AudioClipaudioClip; if(audioDic.TryGetValue(audioName,outaudioClip)) { //Debug.Log("按钮点击的clip名字是:"+audioClip.name); audioSource.gameObject.SetActive(true); audioSource.clip=audioClip; if(audioSource.isPlaying) { audioSource.Stop(); } audioSource.Play(); } } /// ///声音淡入 /// ///播放器序号 /// 音频名称 /// 是否循环 /// publicIEnumeratorAudioFadeIn(intindex,stringaudioName,boolisLoop) { floatinitVolume=0; floatpreTime=1.0f/5;//渐变率 AudioClipaudioClip; if(audioDic.TryGetValue(audioName,outaudioClip)) { AudioSourceaudioSource=this.transform.GetChild(index).GetComponent (); if(audioSource==null)yieldbreak; audioSource.gameObject.SetActive(true);//声音播放对象默认为false,播放时把对应的对象设为true audioSource.clip=audioClip; audioSource.volume=0; audioSource.loop=isLoop; print("zhi0"); if(audioSource.isPlaying) { audioSource.Stop(); } audioSource.Play(); audioSource.volume=0; while(true) { initVolume+=1*Time.deltaTime*preTime;//声音渐高 audioSource.volume=initVolume;//将渐高变量赋值给播放器音量 if(initVolume>=1-0.02f)//如果很接近配置文件中的值,那么将其固定在配置文件中的值(最大值) { audioSource.volume=1; break; } yieldreturn1; } } } /// ///声音淡出 /// ///淡出的播放器序号 /// publicIEnumeratorAudioFadedOut(intindex) { AudioSourceaudioSource=this.transform.GetChild(index).GetComponent (); if(audioSource==null||audioSource.volume==0||audioSource==null) { yieldbreak; } floatinitVolume=audioSource.volume; floatpreTime=1.0f/5; while(true) { initVolume+=-1*Time.deltaTime*preTime; audioSource.volume=initVolume; if(initVolume<=0) { audioSource.volume=0; audioSource.Stop(); break; } yieldreturn1; } } /// ///初始化音频 /// ///privatevoidInitAudioSource(AudioSourceaudioSource) { if(audioSource==null) { return; } if(audioSource.isPlaying) { audioSource.Stop(); } audioSource.playOnAwake=false; audioSource.loop=false; audioSource.volume=1; audioSource.clip=null; audioSource.name="AudioObjectPool"; } privatevoidDestroy() { StopAllCoroutines(); } } #region声音对象池 /*声音对象池,待完善,可能存在同一时间多种声音源在播放,硬切或者播放完毕再切,无法判定是那种,无法准确释放AudioObjectPool 这里只是在开局使用对象池生成了指定个数的播放器,没有用到获取和释放播放器对象*/ publicclassAudioObjectPool { //要生成的对象池预设 privateGameObjectprefab; //对象池列表 privateList pool; //构造函数 publicAudioObjectPool(GameObjectprefab,intinitialSize) { this.prefab=prefab; this.pool=newList (); for(inti=0;i 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。