一:目的

游戏音频的播放在任何游戏中都占据非常重要的地位,音频的播放可以分为两种,一种为游戏音乐,另一种为游戏音效。前者适用于较长的音乐,如游戏背景音乐。第二种适用于比较短的游戏音乐,如开枪瞬间的音效
在Unity中有两个关于音频的重要组件:AudioListener和AudioSource,通过AudioListener进行监听,AudioSource进行播放

所以我们需要一个管理器统一管理音频的相关操作


二:解决的问题及优点

——音效的播放、暂停、继续、静音
——背景音乐的播放、暂停、继续、静音、渐隐


三:使用方法

——将所有音频文件统一放在Resources文件夹下的Sounds文件夹下
——使用SoundMgr.Ins.XXX

SoundMgr.Ins.PlayBGM("bgm");
SoundMgr.Ins.PlaySound("coin");
SoundMgr.Ins.StopPlay();
SoundMgr.Ins.PausePlay();
SoundMgr.Ins.BGMFade(2);

四:代码实现

using UnityEngine;/// <summary>
/// 音频管理器
/// </summary>
public class SoundMgr : MonoSingleton<SoundMgr>
{public const string SoundDir = "Sounds/";//音频目录//BGM播放器private AudioSource bgmPlayer;public AudioSource BgmPlayer { get { return bgmPlayer; } }//音效播放器private AudioSource soundPlayer;public AudioSource SoundPlayer { get { return soundPlayer; } }//是否全局静音public bool IsGlobalMute { get { return bgmPlayer.mute && soundPlayer.mute; } }public override void Awake(){base.Awake();if (bgmPlayer == null){bgmPlayer = gameObject.AddComponent<AudioSource>();bgmPlayer.loop = true;bgmPlayer.playOnAwake = false;bgmPlayer.mute = false;}if (soundPlayer == null){soundPlayer = gameObject.AddComponent<AudioSource>();soundPlayer.loop = false;soundPlayer.playOnAwake = false;soundPlayer.mute = false;}}#region Interface/// <summary>/// 播放音效/// </summary>public void PlaySound(string soundName, float volume = 1, bool loop = false){AudioClip clip = Resources.Load<AudioClip>(SoundDir + soundName);if (clip == null){Debug.LogError("没有此音频:" + soundName);return;}soundPlayer.clip = clip;soundPlayer.volume = volume;soundPlayer.loop = loop;soundPlayer.Play();}/// <summary>/// 播放背景音乐/// </summary>public void PlayBGM(string bgmName, float volume = 1, bool loop = true){AudioClip clip = Resources.Load<AudioClip>(SoundDir + bgmName);if (clip == null){Debug.LogError("没有此音频:" + bgmName);return;}bgmPlayer.clip = clip;bgmPlayer.volume = volume;bgmPlayer.loop = loop;bgmPlayer.Play();}/// <summary>/// 背景音乐渐隐/// </summary>public void FadeBGM(float fadeDuration){bgmFade = true;bgmFadeBeginTime = Time.realtimeSinceStartup;bgmFadeBeginVolume = bgmPlayer.volume;bgmFadeDuration = fadeDuration;}/// <summary>/// 暂停播放/// </summary>public void PausePlay(){bgmPlayer.Pause();soundPlayer.Pause();}/// <summary>/// 继续播放/// </summary>public void ResumePlay(){bgmPlayer.Play();soundPlayer.Play();}/// <summary>/// 停止播放/// </summary>public void StopPlay(){bgmPlayer.Stop();soundPlayer.Stop();}/// <summary>/// 设置静音状态/// </summary>public void SetMuteState(bool b){bgmPlayer.mute = b;soundPlayer.mute = b;}/// <summary>/// 设置BGM静音状态/// </summary>public void SetBgmMuteState(bool b){bgmPlayer.mute = b;}/// <summary>/// 设置Sound静音状态/// </summary>public void SetSoundMuteState(bool b){soundPlayer.mute = b;}/// <summary>/// 停止播放BGM/// </summary>public void StopPlayBGM(){bgmPlayer.Stop();}/// <summary>/// 暂停播放BGM/// </summary>public void PausePlayBGM(){bgmPlayer.Pause();}/// <summary>/// 继续播放BGM/// </summary>public void ResumePlayBGM(){bgmPlayer.Play();}/// <summary>/// 停止播放音效/// </summary>public void StopPlaySound(){soundPlayer.Stop();}#endregion#region Toolsprivate bool bgmFade;//背景音乐是否渐隐private float bgmFadeBeginVolume;//背景音乐渐隐开始时的音量private float bgmFadeBeginTime;//背景音乐渐隐开始的时间private float bgmFadeDuration;//背景音乐渐隐的时间private void Update(){if (bgmFade){float delta = Time.realtimeSinceStartup - bgmFadeBeginTime;if (delta <= bgmFadeDuration){bgmPlayer.volume = Mathf.Lerp(bgmFadeBeginVolume, 0, delta / bgmFadeDuration);}else{bgmFade = false;bgmPlayer.volume = 0;}}}#endregion
}

U3D游戏开发框架(四)——音频管理器相关推荐

  1. H5 微信小游戏 —— 音频管理器

    前言 原本使用的是 egret 的 egret.SoundChannel 和 egret.Sound 来管理音频,但不知为何在重复将游戏切换到前后台后,很容易出现背景音播放不全.播放重复和无法播放的问 ...

  2. win7系统怎样打开音频服务器,win7系统打开音频管理器的具体教程

    win7系统使用久了,好多网友反馈说win7系统打开音频管理器的问题,非常不方便.有什么办法可以永久解决win7系统打开音频管理器的问题,面对win7系统打开音频管理器的图文步骤非常简单,只需要1.点 ...

  3. Android之AudioManager(音频管理器)详解

    AudioManager简介: AudioManager类提供了访问音量和振铃器mode控制.使用Context.getSystemService(Context.AUDIO_SERVICE)来得到这 ...

  4. [翻译] SoundManager 音频管理器

    SoundManager 音频管理器 https://github.com/nicklockwood/SoundManager Purpose SoundManager is a simple cla ...

  5. WIN10插入耳机没声音,Realtek音频管理器打不开

    装完显卡之后电脑突然就没声音了,百度了好多方法也没解决,其中打开 Realtek音频管理器 的方法是比较靠谱的,C:\Program Files\Realtek\Audio\HDA,在这个目录下打开 ...

  6. 耳机插入电脑没反应 控制面板也找不到realtek音频管理器的解决方案

    运行框(win+R)输入msconfig,回车 将[立体音频组合器服务]前面的这个[√]去掉下,确定,可能需要重启计算机.我的是有提醒重启计算机.控制面板还是看不到找不到realtek音频管理器,但耳 ...

  7. unity全局总的音频管理器

    这篇博客介绍一个unity的总的音频管理器 可以有效避免音频错乱的问题 我们把它挂在场景中 可以使用跨场景保存的方法来实现场景跳转之后的存在 首先 这篇博客会用到我之前介绍的知识 我下面把链接先给大家 ...

  8. win10系统,主机箱的前置耳麦插孔用不了,“设置——声音”麦克风或者耳机已拔出未修复,“输入设备”无插座信息,更新驱动也无效,控制面板——小图标里查不到realtek高清晰音频管理器——一招解决

    win10系统,有一天忽然固态硬盘坏了,拆了重装系统之后主机箱的前置耳麦插孔里,插了耳机只能听到声音,麦克风无效,微信语音电话打不出去了. 查了一圈,"设置--声音"显示:麦克风或 ...

  9. Android音频管理器AudioManager用法

    当我们在听歌时,当我们在刷小视频时,当我们在看动漫.在看电影.在追剧时,不知道是否有人注意到,在这些软件中滑动屏幕或者拖动滑动条就可以直接控制音量,而不需要去按手机硬件上的音量键. 在某些时候,程序需 ...

最新文章

  1. 考察新人的两道c语言题目
  2. 登录界面的滑动_电脑同时登录两个微信,原来这么简单?3步搞定!
  3. linux系统不关机添加硬盘吗,CentOS中不重启添加硬盘
  4. python列表删除指定字典_Python:从列表中删除字典
  5. linux平台下 延迟工作队列实例
  6. js学习(4) 函数
  7. CentOS 5.4 下配置FTP服务器 [转帖]
  8. CSharpGL(36)通用的非托管数组排序方法
  9. UtilSession failed: Prerequisite check CheckSystemSpace space(22288172004) is not availa
  10. mysql数据库属性_mysql - 数据库操作和数据属性
  11. 基础算法学习(二)_二叉树及应用赫夫曼编码
  12. Hadoop MapReduce执行过程(一)
  13. Java 算法 判定字符位置
  14. restTemplate请求,报 : No instances avaliable for ip地址
  15. C++入门系列博客二 C++ 控制流
  16. 蚁群算法原理及matlab代码实现
  17. 小米 OJ 编程比赛 02 月常规赛 (Carryon 数数字)
  18. matlab做南丁格尔玫瑰图,用VBA做个南丁格尔玫瑰图模板!
  19. react 中子路由(route)或二级路由如何配置?
  20. 天作之合:水果与朗姆酒

热门文章

  1. MySQL结课体会,听课心得体会小结
  2. [Python]调用百度API进行自然语言处理 标签、关键字 以及 词法分析
  3. 如何解决Error running ‘Tomcat 8.5.45‘: port out of range:-1
  4. 解决办法在idea中搭建spark环境:Unable to fetch table student. Invalid method name: ‘get_table_req‘;
  5. JavaEE实现微博项目(含注册、登录、发表微博、评论微博、关注博主、阅读排行榜、评论排行榜等功能)
  6. 最长对称子串 作者 陈越单位 浙江大学
  7. yacclex-Chapter1
  8. Cortex-M MMU内存管理单元和 Linux
  9. 关于评审--从思想到落地
  10. RMAN 下CROSSCHECK命令 详解