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字典
privateDictionaryaudioDic=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;
//对象池列表
privateListpool;
//构造函数
publicAudioObjectPool(GameObjectprefab,intinitialSize)
{
this.prefab=prefab;
this.pool=newList();
for(inti=0;i
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。