Csharp/C#教程: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列表 publicList<AudioClip>audioList; //初始声音预设数量 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<string,AudioClip>audioDic=newDictionary<string,AudioClip>(); //背景音乐 privateAudioSourcebgAudioSource; //声音对象池 privateAudioObjectPoolaudioObjectPool; privatevoidStart() { GameObjectaudioPrefab=newGameObject("AudioObjectPool"); audioPrefab.AddComponent<AudioSource>(); audioPrefab.GetComponent<AudioSource>().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<AudioSource>(); } privatevoidUpdate() { //测试代码 if(Input.GetMouseButtonDown(0)) { //StartCoroutine(AudioFadeIn(0,"沈木-SoldOut(热播版)",true));//音乐渐入 //PlayAudio(0,"沈木-SoldOut(热播版)");//直接播放 } if(Input.GetMouseButtonDown(1)) { //StartCoroutine(AudioFadedOut(0));//音乐淡出 } } ///<summary> ///音频播放 ///</summary> ///<paramname="index">播放器序号(用第几个AudioSource播放)</param> publicvoidPauseAudio(intindex) { AudioSourceaudioSource=this.transform.GetChild(index).GetComponent<AudioSource>(); audioSource.Pause(); } ///<summary> ///继续播放 ///</summary> ///<paramname="index">播放器序号</param> publicvoidResumeAudio(intindex) { AudioSourceaudioSource=this.transform.GetChild(index).GetComponent<AudioSource>(); audioSource.UnPause(); } ///<summary> ///停止播放声音 ///</summary> ///<paramname="index">播放器序号</param> publicvoidStopAudio(intindex) { AudioSourceaudioSource=this.transform.GetChild(index).GetComponent<AudioSource>(); audioSource.Stop(); } ///<summary> ///播放背景音乐,这里直接固定0号播放器用来播放北京音乐 ///</summary> ///<paramname="audioNme"></param> 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; } } ///<summary> ///直接播放声音 ///</summary> ///<paramname="index">播放器序号</param> ///<paramname="audioName">音频文件名称</param> ///<paramname="volume">音量大小</param> ///<paramname="isLoop">是否循环</param> publicvoidPlayAudio(intindex,stringaudioName,floatvolume=1,boolisLoop=false) { //Debug.Log("------------执行播放声音----------------"); AudioSourceaudioSource=this.transform.GetChild(index).GetComponent<AudioSource>(); 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(); } } ///<summary> ///重载播放,只有播放器和音频 ///</summary> ///<paramname="index">播放器序号</param> ///<paramname="audioName">音频的名称</param> publicvoidPlayAudio(intindex,stringaudioName) { //Debug.Log("------------执行播放声音----------------"); AudioSourceaudioSource=this.transform.GetChild(index).GetComponent<AudioSource>(); 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(); } } ///<summary> ///声音淡入 ///</summary> ///<paramname="index">播放器序号</param> ///<paramname="audioName">音频名称</param> ///<paramname="isLoop">是否循环</param> ///<returns></returns> publicIEnumeratorAudioFadeIn(intindex,stringaudioName,boolisLoop) { floatinitVolume=0; floatpreTime=1.0f/5;//渐变率 AudioClipaudioClip; if(audioDic.TryGetValue(audioName,outaudioClip)) { AudioSourceaudioSource=this.transform.GetChild(index).GetComponent<AudioSource>(); 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; } } } ///<summary> ///声音淡出 ///</summary> ///<paramname="index">淡出的播放器序号</param> ///<returns></returns> publicIEnumeratorAudioFadedOut(intindex) { AudioSourceaudioSource=this.transform.GetChild(index).GetComponent<AudioSource>(); 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; } } ///<summary> ///初始化音频 ///</summary> ///<paramname="audioSource"></param> 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<GameObject>pool; //构造函数 publicAudioObjectPool(GameObjectprefab,intinitialSize) { this.prefab=prefab; this.pool=newList<GameObject>(); for(inti=0;i<initialSize;i++) { //进行初始化 AllLocateInstance(); } } //获取实例 publicGameObjectGetInstance() { if(pool.Count==0) { //创建实例 } GameObjectinstance=pool[0]; pool.RemoveAt(0); instance.SetActive(true); returninstance; } //释放实力 publicvoidReleaseInstance(GameObjectinstance) { instance.SetActive(false); pool.Add(instance); } //生成本地实力 privateGameObjectAllLocateInstance() { GameObjectinstance=(GameObject)GameObject.Instantiate(prefab); instance.transform.SetParent(AudioManagerP._instance.transform); instance.SetActive(false); pool.Add(instance); returninstance; } } #endregion 您可能感兴趣的文章:Unity实现鼠标或者手指点击模型播放动画Unity调取移动端的麦克风进行录音并播放Unity代码实现序列帧动画播放器Unity3D实现播放gif图功能在Unity中实现动画的正反播放代码

标签: ni

PIP和conda 更换国内安装源的方法步骤

C++17 使用 std::string_view避免字符串拷贝优化程序性能

上述就是C#学习教程:Unity实现音频播放管理器分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/903690.html

(0)
上一篇 2021年10月21日
下一篇 2021年10月21日

精彩推荐