界面音效以及3D音效通过参数控制声音加载声音资源包
补充博客把音效的课件加进来
namespace YouYou
{/// <summary>/// 音频组件/// </summary>public class AudioComponent : YouYouBaseComponent, IUpdateComponent{private AudioManager m_AudioManager;[Header("释放间隔")][SerializeField]private int m_ReleaseInterval = 120;protected override void OnAwake(){base.OnAwake();m_AudioManager = new AudioManager(m_ReleaseInterval);GameEntry.RegisterUpdateComponent(this);}public void OnUpdate(){m_AudioManager.OnUpdate();}public override void Shutdown(){GameEntry.RemoveUpdateComponent(this);ShopAllAudio();StopBGM();}/// <summary>/// 加载音频文件/// </summary>/// <param name="onComplete"></param>public void LoadBanks(BaseAction onComplete){m_AudioManager.LoadBanks(onComplete);}#region BGM/// <summary>/// 播放BGM/// </summary>public void PlayBGM(int audioId){Sys_AudioEntity entity = GameEntry.DataTable.DataTableManager.Sys_AudioDBModel.GetDic(audioId);if (entity != null){PlayBGM(entity.AssetPath, entity.Volume);}else{GameEntry.LogError("BGM不存在ID={0}", audioId);}}/// <summary>/// 播放BGM/// </summary>public void PlayBGM(string assetPath, float volume = 1){m_AudioManager.PlayBGM(assetPath, volume);}/// <summary>/// 设置BGM音量/// </summary>/// <param name="value"></param>public void SetBGMVolume(float value){m_AudioManager.SetBGMVolume(value);}/// <summary>/// 暂停BGM/// </summary>/// <param name="pause"></param>public void PauseBGM(bool pause){m_AudioManager.PauseBGM(pause);}/// <summary>/// 停止播放BGM/// </summary>public void StopBGM(){m_AudioManager.StopBGM();}/// <summary>/// 开始播放BGM/// </summary>public void StartBGM(){m_AudioManager.StartBGM();}#endregion#region 音效/// <summary>/// 播放音效/// </summary>public int PlayAydio(int audioId, string parameterName = null, float value = 0, Vector3 pos3D = default){Sys_AudioEntity entity = GameEntry.DataTable.DataTableManager.Sys_AudioDBModel.GetDic(audioId);if (entity != null){return PlayAydio(entity.AssetPath, entity.Volume, parameterName, value, entity.Is3D == 1, pos3D);}else{GameEntry.LogError("Audio不存在Id = {0}", audioId);return -1;}}/// <summary>/// 播放音效/// </summary>public int PlayAydio(string assetPath, float volume, string parameterName, float value, bool is3D, Vector3 pos3D){return m_AudioManager.PlayAudio(assetPath, volume, parameterName, value, is3D, pos3D);}/// <summary>/// 设置音效参数/// </summary>public void SetParameterForAudio(int serialId, string parameterName, float value){m_AudioManager.SetParameterForAudio(serialId, parameterName, value);}/// <summary>/// 暂停某个音效/// </summary>/// <param name="serialId"></param>/// <param name="paused"></param>/// <returns></returns>public bool PausedAudio(int serialId, bool paused = true){return m_AudioManager.PausedAudio(serialId, paused);}/// <summary>/// 停止某个音效/// </summary>/// <param name="serialId"></param>/// <param name="mode"></param>/// <returns></returns>internal bool StopAudio(int serialId, FMOD.Studio.STOP_MODE mode = FMOD.Studio.STOP_MODE.IMMEDIATE){return m_AudioManager.StopAudio(serialId, mode);}/// <summary>/// 停止所有音效/// </summary>public void ShopAllAudio(){m_AudioManager.ShopAllAudio();}#endregion}
}
namespace YouYou
{/// <summary>/// 音频管理器/// </summary>public class AudioManager : ManagerBase{internal AudioManager(int releaseInterval){m_ReleaseInterval = releaseInterval;}internal void OnUpdate(){//多长时间释放一次,是在Updata中if (Time.time > m_NextReleaseTime + m_ReleaseInterval){m_NextReleaseTime = Time.time;Release();}}internal void LoadBanks(BaseAction onComplete){
#if DISABLE_ASSETBUNDLEstring[] arr = Directory.GetFiles(Application.dataPath + "/Download/Audio/", "*.bytes");for (int i = 0; i < arr.Length; i++){FileInfo file = new FileInfo(arr[i]);TextAsset asset = UnityEditor.AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/Download/Audio/" + file.Name);RuntimeManager.LoadBank(asset);}if (onComplete != null) onComplete();
#elif ASSETBUNDLEGameEntry.Resource.ResourceLoaderManager.LoadAssetBundle(ConstDefine.AudioAssetBundlePath, onComplete: (AssetBundle bundle) =>{TextAsset[] arr = bundle.LoadAllAssets<TextAsset>();int len = arr.Length;for (int i = 0; i < len; i++){RuntimeManager.LoadBank(arr[i]);}if (onComplete != null) onComplete();});
#elif RESOURCESTextAsset[] assets = Resources.LoadAll<TextAsset>("Audio");for (int i = 0; i < assets.Length; i++){RuntimeManager.LoadBank(assets[i]);}if (onComplete != null) onComplete();
#endif}#region BGMprivate string m_CurrBGMAudio;private float m_CurrBGMVolume;private float m_CurrBGMMaxVolume;private EventInstance BGMEvent;private TimeAction m_CurrBGMTimeAction;/// <summary>/// 播放BGM/// </summary>/// <param name="bgmPath"></param>internal void PlayBGM(string bgmPath, float volume = 1){m_CurrBGMAudio = bgmPath;m_CurrBGMMaxVolume = volume;CheckBGMEventInstance();}/// <summary>/// BGM切换参数/// </summary>private void CheckBGMEventInstance(string switchName, float value){BGMEvent.setParameterByName(switchName, value);}/// <summary>/// 设置BGM音量/// </summary>/// <param name="value"></param>internal void SetBGMVolume(float value){BGMEvent.setVolume(value);}/// <summary>/// 暂停BGM/// </summary>/// <param name="pause"></param>internal void PauseBGM(bool pause){if (!BGMEvent.isValid()) CheckBGMEventInstance();if (BGMEvent.isValid()) BGMEvent.setPaused(pause);}/// <summary>/// 检查BGM实例把之前的释放掉/// </summary>private void CheckBGMEventInstance(){if (!string.IsNullOrEmpty(m_CurrBGMAudio)){if (BGMEvent.isValid()){BGMEvent.stop(FMOD.Studio.STOP_MODE.IMMEDIATE);BGMEvent.release();}BGMEvent = RuntimeManager.CreateInstance(m_CurrBGMAudio);m_CurrBGMVolume = 0;SetBGMVolume(m_CurrBGMVolume);BGMEvent.start();//把音量逐渐变成Maxm_CurrBGMTimeAction = GameEntry.Time.CreateTimeAction();m_CurrBGMTimeAction.Init(0, 0.05f, 100, null, (int loop) =>{m_CurrBGMVolume += 0.1f;m_CurrBGMVolume = Mathf.Min(m_CurrBGMVolume, m_CurrBGMMaxVolume);SetBGMVolume(m_CurrBGMVolume);if (m_CurrBGMVolume == m_CurrBGMMaxVolume){m_CurrBGMTimeAction.Stop();}}, null).Run();}}/// <summary>/// 停止播放BGM/// </summary>internal void StopBGM(){if (BGMEvent.isValid()){//把音量逐渐变成0 再停止m_CurrBGMTimeAction = GameEntry.Time.CreateTimeAction();m_CurrBGMTimeAction.Init(0, 0.05f, 100, null, (int loop) =>{m_CurrBGMVolume -= 0.1f;m_CurrBGMVolume = Mathf.Max(m_CurrBGMVolume, 0);SetBGMVolume(m_CurrBGMVolume);if (m_CurrBGMVolume == 0){m_CurrBGMTimeAction.Stop();BGMEvent.stop(FMOD.Studio.STOP_MODE.IMMEDIATE);}}, () =>{BGMEvent.stop(FMOD.Studio.STOP_MODE.IMMEDIATE);}).Run();}}/// <summary>/// 开始播放BGM/// </summary>internal void StartBGM(){BGMEvent.start();}#endregion#region 音效/// <summary>/// 释放间隔/// </summary>private int m_ReleaseInterval = 120;/// <summary>/// 下次释放时间/// </summary>private float m_NextReleaseTime = 0f;/// <summary>/// 序号/// </summary>private int m_Serial = 0;/// <summary>/// 音效字典/// </summary>private Dictionary<int, EventInstance> m_CurrAudioEventsDic = new Dictionary<int, EventInstance>();/// <summary>/// 需要释放的音效编号/// </summary>private LinkedList<int> m_NeedRemoveList = new LinkedList<int>();/// <summary>/// 播放音效/// </summary>internal int PlayAudio(string eventPath, float volume = 1, string parameterName = null, float value = 0, bool is3D = false, Vector3 pos3D = default){if (string.IsNullOrEmpty(eventPath)) return -1;//生成一个音频EventInstance eventInstance = RuntimeManager.CreateInstance(eventPath);//设置音量eventInstance.setVolume(volume);//设置参数if (!string.IsNullOrEmpty(parameterName)) eventInstance.setParameterByName(parameterName, value);//设置3D音效,设置3D音效位置if (is3D) eventInstance.set3DAttributes(pos3D.To3DAttributes());eventInstance.start();int serialId = m_Serial++;m_CurrAudioEventsDic[serialId] = eventInstance;return serialId;}/// <summary>/// 设置音效参数/// </summary>internal void SetParameterForAudio(int serialId, string parameterName, float value){EventInstance eventInstance;if (m_CurrAudioEventsDic.TryGetValue(serialId, out eventInstance)){if (eventInstance.isValid()) eventInstance.setParameterByName(parameterName, value);}}/// <summary>/// 暂停某个音效/// </summary>/// <param name="serialId"></param>/// <param name="paused"></param>/// <returns></returns>internal bool PausedAudio(int serialId, bool paused = true){EventInstance eventInstance;if (m_CurrAudioEventsDic.TryGetValue(serialId, out eventInstance)){if (eventInstance.isValid()){return eventInstance.setPaused(paused) == FMOD.RESULT.OK;}}return false;}/// <summary>/// 停止某个音效/// </summary>/// <param name="serialId"></param>/// <param name="mode"></param>/// <returns></returns>internal bool StopAudio(int serialId, FMOD.Studio.STOP_MODE mode = FMOD.Studio.STOP_MODE.IMMEDIATE){EventInstance eventInstance;if (m_CurrAudioEventsDic.TryGetValue(serialId, out eventInstance)){if (eventInstance.isValid()){var result = eventInstance.stop(mode);//释放掉eventInstance.release();//从字典中移除掉m_CurrAudioEventsDic.Remove(serialId);return result == FMOD.RESULT.OK;}}return false;}/// <summary>/// 停止所有音效/// </summary>internal void ShopAllAudio(){var enumerator = m_CurrAudioEventsDic.GetEnumerator();while (enumerator.MoveNext()){EventInstance eventInstance = enumerator.Current.Value;if (eventInstance.isValid()){var reselt = eventInstance.stop(FMOD.Studio.STOP_MODE.IMMEDIATE);eventInstance.release();}}m_CurrAudioEventsDic.Clear();}/// <summary>/// 释放可释放的音效/// </summary>private void Release(){var lst = m_CurrAudioEventsDic.GetEnumerator();while (lst.MoveNext()){EventInstance eventInstance = lst.Current.Value;if (!eventInstance.isValid()) continue;PLAYBACK_STATE state;eventInstance.getPlaybackState(out state);//音效的状态停止if (state == PLAYBACK_STATE.STOPPED){m_NeedRemoveList.AddLast(lst.Current.Key);eventInstance.stop(FMOD.Studio.STOP_MODE.IMMEDIATE);eventInstance.release();}}LinkedListNode<int> currNode = m_NeedRemoveList.First;while (currNode != null){LinkedListNode<int> next = currNode.Next;int serialId = currNode.Value;m_CurrAudioEventsDic.Remove(serialId);m_NeedRemoveList.Remove(currNode);currNode = next;}}#endregion}
}
打开调用
关闭调用
通过速度控制声音的变幻,模拟汽车声音,混合音效
整个音频文件打一个资源包,初始资源,声音不需要加密
打包打好之后放入CDN的download文件夹下
预加载中
界面音效以及3D音效通过参数控制声音加载声音资源包相关推荐
- Spring使用环境变量控制配置文件加载(转)
项目中需要用到很多配置文件,不同环境的配置文件是不一样的,因此如果只用一个配置文件,势必会造成配置文件混乱,这里提供一种利用环境变量控制配置文件加载的方法,如下: 一.配置环境变量 如果是window ...
- 海康工业相机功能模块-参数保存、加载、批量复制参数
海康工业相机功能模块-参数保存与加载 前言 相机参数保存的快速方法 相机参数导入导出的操作方法 UserSetLoad 加载相机内部参数 FeatureLoad/FeatureSave FileAcc ...
- unity 3D里有两种动态加载机制
unity 3D里有两种动态加载机制: 一是Resources.Load: 一是通过AssetBundle: 其实两者本质上没有什么区别.Resources.Load就是从一个缺省打进程序包里的Ass ...
- Spring 使用注解@DependsOn控制Bean加载顺序
文章目录 1. 前言 2. 代码实现 1. 前言 默认情况下,Spring加载Bean的顺序是不确定的(或者可以理解为,按编译后的class文件顺序加载).当我们需要控制Bean加载顺序以满足特定的需 ...
- uboot加载linux内核加载那些内容,几个地址参数及uboot加载启动内核过程的理解
关于uBoot和Linux内核中几个地址参数及uboot加载启动内核过程的理解 uboot一般使用mkimage工具先制作一个启动映象文件来引导识别内核的,uboot源代码的tools/目录下有mki ...
- Springboot Web应用中服务器配置参数ServerProperties的加载
#概述 Springboot配置文件中以server开头的项表示服务器的配置参数,这一点从字面意义即可直观理解,这些参数,包括端口,路径设置,SSL配置参数等等.具体有哪些参数,从源代码的角度上,可以 ...
- 视频教程 | 3D版切水果游戏开发实战5:加载美术资源
在我们的前4期开发实战中,我们写代码使用的切割物体都是Egret Pro自带的实体,如:球体.椎体.立方体等,今天我们就来讲讲如何将游戏场景中的切割对象换成美术提供的水果和切刀素材. 核心内容比较简单 ...
- 【待更新】GPU 保存模型参数,GPU 加载模型参数
GPU 保存模型参数,GPU 加载模型参数 保存 # 模型 device = torch.device('cuda') net = KGCN(num_user, num_entity, num_rel ...
- [TensorFlow深度学习入门]实战七·简便方法实现TensorFlow模型参数保存与加载(ckpt方式)
[TensorFlow深度学习入门]实战七·简便方法实现TensorFlow模型参数保存与加载(ckpt方式) 个人网站–> http://www.yansongsong.cn TensorFl ...
- oracle控制文件加载数据,关于SQLLOAD控制文件参数的问题
问一句关于SQLLOAD控制文件参数的问题 其中的FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY "" OPTIONALLY ENC ...
最新文章
- NAT和IPsec并存的几种模型(方案一)
- NOIP2017总结与反思
- 树莓派工程设计常见问题与处理
- linux下的shell编程
- boost::coroutine模块实现分段堆栈的测试程序
- python递归迭代_Python入门基础知识点(python迭代器和递归)
- 工业以太网交换机可以家用吗?
- flutter TextField 限制只允许输入数字 小数点
- java 字符菜单_java该怎么写左侧菜单树
- android获取mp3时间长,android 获取音频时长
- C4D新建立方体对象不显示?
- chrome浏览器 自带网页截取长图功能
- SpringCachemanager使用Cache(redis作为缓存中间件)
- C语言实现约分最简分式
- 解决ValueError: Cannot run multiple SparkContexts at once; existing SparkContext
- 西门吹雪和他的剑——剑神和剑道
- Yocto系列讲解[理论篇]24 - BitBake全过程(2)
- 2019TFE计算机科学排名,美国留学|2019TFE Times 硕士专业排名
- smalltalk 上手
- VBoxManager很强大哈!