1、分享一个Unity中用于管理声音的声音管理器,适合于中小型项目。

2、借鉴了很多的源码,最后修改完成,吸取百家之长,改为自己所用。

3、源码如下:

  1. /*
  2. *
  3. * 开发时间:2018.11.20
  4. *
  5. * 功能:用来对项目中的所有音频做同一的管理
  6. *
  7. * 描述:
  8. * 1、挂载该脚本的游戏物体上要挂载三个AudioSouce[可以修改脚本,动态挂]
  9. * 2、建议大的背景音乐不要加入AudioClip[],对内存消耗大。而是哪里用到,单独使用PlayBackground函数播放
  10. * 3、小的音效片段可以将其加入AudioClip[]中,可以很方便的管理,可以通过声音剪辑、声音剪辑名称来进行音乐的播放
  11. * 4、该声音管理可以进行背景音乐的播放、音效的播放、背景音乐的音调改变、音效的音调改变、停止播放
  12. *
  13. */
  14. using UnityEngine;
  15. using System.Collections;
  16. using System.Collections.Generic;
  17.  
  18. namespace Kernal
  19. {
  20. public class AudioManager : MonoBehaviour
  21. {
  22. public AudioClip[] AudioClipArray; //剪辑数组
  23.  
  24. public static float AudioBackgroundVolumns = 1F; //背景音量
  25. public static float AudioEffectVolumns = 1F; //音效音量
  26. public static float AudioBackgroundPitch = 1f; //背景音乐的音调
  27. public static float AudioEffectPitch = 1.0f; //音效的音调
  28.  
  29. private static Dictionary<string, AudioClip> _DicAudioClipLib; //音频库,将声音名字和声音资源进行关联
  30.  
  31. private static AudioSource[] _AudioSourceArray; //音频源数组
  32.  
  33. private static AudioSource _AudioSource_BackgroundAudio; //背景音乐
  34. private static AudioSource _AudioSource_AudioEffectA; //音效源A
  35. private static AudioSource _AudioSource_AudioEffectB; //音效源B
  36. //......可以按需求进行添加
  37.  
  38. /// <summary>
  39. /// 音效库资源加载
  40. /// </summary>
  41. void Awake()
  42. {
  43. //音频库加载[初始化,将音乐剪辑和名字联系起来]
  44. _DicAudioClipLib = new Dictionary<string, AudioClip>();
  45.  
  46. foreach (AudioClip audioClip in AudioClipArray)
  47. {
  48. _DicAudioClipLib.Add(audioClip.name, audioClip);
  49. }
  50.  
  51. //处理音频源,也就是得到用来播放声音的音乐播放器
  52. _AudioSourceArray = this.GetComponents<AudioSource>();
  53. _AudioSource_BackgroundAudio = _AudioSourceArray[]; //其中一个用来播放背景音乐
  54. _AudioSource_AudioEffectA = _AudioSourceArray[]; //其中一个用来播放音乐1
  55. _AudioSource_AudioEffectB = _AudioSourceArray[];
  56.  
  57. //从数据持久化中得到音量数值
  58. if (PlayerPrefs.GetFloat("AudioBackgroundVolumns") >= )
  59. {
  60. AudioBackgroundVolumns = PlayerPrefs.GetFloat("AudioBackgroundVolumns");
  61. _AudioSource_BackgroundAudio.volume = AudioBackgroundVolumns;
  62. }
  63.  
  64. if (PlayerPrefs.GetFloat("AudioEffectVolumns") >= )
  65. {
  66. AudioEffectVolumns = PlayerPrefs.GetFloat("AudioEffectVolumns");
  67. _AudioSource_AudioEffectA.volume = AudioEffectVolumns;
  68. _AudioSource_AudioEffectB.volume = AudioEffectVolumns;
  69. }
  70.  
  71. //设置音乐的音效
  72. if (PlayerPrefs.HasKey("AudioBackgroundPitch"))
  73. {
  74. AudioBackgroundPitch = PlayerPrefs.GetFloat("AudioBackgroundPitch");
  75. }
  76. if (PlayerPrefs.HasKey("AudioEffectPitch"))
  77. {
  78. AudioEffectPitch = PlayerPrefs.GetFloat("AudioEffectPitch");
  79. }
  80.  
  81. _AudioSource_BackgroundAudio.pitch = AudioBackgroundPitch;
  82. _AudioSource_AudioEffectA.pitch = AudioEffectPitch;
  83. _AudioSource_AudioEffectB.pitch = AudioEffectPitch;
  84.  
  85. }
  86.  
  87. /// <summary>
  88. /// 播放背景音乐
  89. /// 传入的参数是背景音乐的AudioClip
  90. /// </summary>
  91. /// <param name="audioClip">音频剪辑</param>
  92. public static void PlayBackground(AudioClip audioClip)
  93. {
  94. //防止背景音乐的重复播放。
  95. if (_AudioSource_BackgroundAudio.clip == audioClip)
  96. {
  97. return;
  98. }
  99.  
  100. //处理全局背景音乐音量
  101. _AudioSource_BackgroundAudio.volume = AudioBackgroundVolumns;
  102. _AudioSource_BackgroundAudio.pitch = AudioBackgroundPitch;
  103. if (audioClip)
  104. {
  105. _AudioSource_BackgroundAudio.loop = true; //背景音乐是循环播放的
  106. _AudioSource_BackgroundAudio.clip = audioClip;
  107. _AudioSource_BackgroundAudio.Play();
  108. }
  109. else
  110. {
  111. Debug.LogWarning("[AudioManager.cs/PlayBackground()] audioClip==null !");
  112. }
  113. }
  114.  
  115. /// <summary>
  116. /// 播放背景音乐
  117. /// 传入的参数是声音片段的名字,要注意,其声音片段要加入声音数组中
  118. /// </summary>
  119. /// <param name="strAudioName"></param>
  120. public static void PlayBackground(string strAudioName)
  121. {
  122. if (!string.IsNullOrEmpty(strAudioName))
  123. {
  124. PlayBackground(_DicAudioClipLib[strAudioName]);
  125. }
  126. else
  127. {
  128. Debug.LogWarning("[AudioManager.cs/PlayBackground()] strAudioName==null !");
  129. }
  130. }
  131.  
  132. /// <summary>
  133. /// 播放音效_音频源A
  134. /// </summary>
  135. /// <param name="audioClip">音频剪辑</param>
  136. public static void PlayAudioEffectA(AudioClip audioClip)
  137. {
  138. //处理全局音效音量
  139. _AudioSource_AudioEffectA.volume = AudioEffectVolumns;
  140. _AudioSource_AudioEffectA.pitch = AudioEffectPitch;
  141.  
  142. if (audioClip)
  143. {
  144. _AudioSource_AudioEffectA.clip = audioClip;
  145. _AudioSource_AudioEffectA.Play();
  146. }
  147. else
  148. {
  149. Debug.LogWarning("[AudioManager.cs/PlayAudioEffectA()] audioClip==null ! Please Check! ");
  150. }
  151. }
  152. /// <summary>
  153. /// 播放音效_音频源A
  154. /// </summary>
  155. /// <param name="strAudioEffctName">音效名称</param>
  156. public static void PlayAudioEffectA(string strAudioEffctName)
  157. {
  158. if (!string.IsNullOrEmpty(strAudioEffctName))
  159. {
  160. PlayAudioEffectA(_DicAudioClipLib[strAudioEffctName]);
  161. }
  162. else
  163. {
  164. Debug.LogWarning("[AudioManager.cs/PlayAudioEffectA()] strAudioEffctName==null ! Please Check! ");
  165. }
  166. }
  167. /// <summary>
  168. /// 播放音效_音频源B
  169. /// </summary>
  170. /// <param name="audioClip">音频剪辑</param>
  171. public static void PlayAudioEffectB(AudioClip audioClip)
  172. {
  173. //处理全局音效音量
  174. _AudioSource_AudioEffectB.volume = AudioEffectVolumns;
  175. _AudioSource_AudioEffectB.pitch = AudioEffectPitch;
  176. if (audioClip)
  177. {
  178. _AudioSource_AudioEffectB.clip = audioClip;
  179. _AudioSource_AudioEffectB.Play();
  180. }
  181. else
  182. {
  183. Debug.LogWarning("[AudioManager.cs/PlayAudioEffectB()] audioClip==null ! Please Check! ");
  184. }
  185. }
  186.  
  187. /// <summary>
  188. /// 播放音效_音频源B
  189. /// </summary>
  190. /// <param name="strAudioEffctName">音效名称</param>
  191. public static void PlayAudioEffectB(string strAudioEffctName)
  192. {
  193. if (!string.IsNullOrEmpty(strAudioEffctName))
  194. {
  195. PlayAudioEffectB(_DicAudioClipLib[strAudioEffctName]);
  196. }
  197. else
  198. {
  199. Debug.LogWarning("[AudioManager.cs/PlayAudioEffectB()] strAudioEffctName==null ! Please Check! ");
  200. }
  201. }
  202.  
  203. /// <summary>
  204. /// 停止播放音效A
  205. /// </summary>
  206. public static void StopPlayAudioEffectA()
  207. {
  208. _AudioSource_AudioEffectA.Stop();
  209. }
  210.  
  211. /// <summary>
  212. /// 停止播放音效B
  213. /// </summary>
  214. public static void StopPlayAudioEffectB()
  215. {
  216. _AudioSource_AudioEffectB.Stop();
  217. }
  218.  
  219. /// <summary>
  220. /// 停止播放背景音乐
  221. /// </summary>
  222. public static void StopPlayAudioBackGround()
  223. {
  224. _AudioSource_BackgroundAudio.Stop();
  225. }
  226.  
  227. /// <summary>
  228. /// 改变背景音乐音量
  229. /// </summary>
  230. /// <param name="floAudioBGVolumns"></param>
  231. public static void SetAudioBackgroundVolumns(float floAudioBGVolumns)
  232. {
  233. _AudioSource_BackgroundAudio.volume = floAudioBGVolumns;
  234. AudioBackgroundVolumns = floAudioBGVolumns;
  235. //数据持久化
  236. PlayerPrefs.SetFloat("AudioBackgroundVolumns", floAudioBGVolumns);
  237. }
  238.  
  239. /// <summary>
  240. /// 改变音效音量
  241. /// </summary>
  242. /// <param name="floAudioEffectVolumns"></param>
  243. public static void SetAudioEffectVolumns(float floAudioEffectVolumns)
  244. {
  245. _AudioSource_AudioEffectA.volume = floAudioEffectVolumns;
  246. _AudioSource_AudioEffectB.volume = floAudioEffectVolumns;
  247. AudioEffectVolumns = floAudioEffectVolumns;
  248. //数据持久化
  249. PlayerPrefs.SetFloat("AudioEffectVolumns", floAudioEffectVolumns);
  250. }
  251.  
  252. /// <summary>
  253. /// 改变背景音乐的音调
  254. /// </summary>
  255. /// <param name="floAudioBGPichs">改变的音调值</param>
  256. public static void SetAudioBackgroundPitch(float floAudioBGPitchs)
  257. {
  258. _AudioSource_BackgroundAudio.pitch = floAudioBGPitchs;
  259.  
  260. //数据持久化
  261. PlayerPrefs.SetFloat("AudioBackgroundPitch", floAudioBGPitchs);
  262. }
  263.  
  264. /// <summary>
  265. /// 改变音效的音调
  266. /// </summary>
  267. /// <param name="floAudioEffectPitchs">音效的音调值</param>
  268. public static void SetAudioEffectPitch(float floAudioEffectPitchs)
  269. {
  270. _AudioSource_AudioEffectA.pitch = floAudioEffectPitchs;
  271. _AudioSource_AudioEffectB.pitch = floAudioEffectPitchs;
  272.  
  273. //数据持久化
  274. PlayerPrefs.SetFloat("AudioEffectPitch", floAudioEffectPitchs);
  275. }
  276.  
  277. }
  278. }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

04、Unity_声音管理器的更多相关文章

  1. Android之声音管理器《AudioManager》的使用以及音量控制

    以下为网上下载然后拼接-- Android声音管理AudioManager使用 手机都有声音模式,声音.静音还有震动,甚至震动加声音兼备,这些都是手机的基本功能.在Android手机中,我们同样可以通 ...

  2. 电脑没有声音,显示“未插入耳机或扬声器”,检测不到Realtek高清晰音频管理器

    2018-7-16,电脑彻夜未关,早上发现已经死机了.关机重启之后,就发现没有声音了,提示“未插入耳机或扬声器”,并且检测不到Realtek高清晰音频管理器,只能检查到显卡音频输出.首先,音箱在其他电 ...

  3. 故障解决 | win10没声音及找不到Realtek高清音频管理器

    重装 win10 系统后,电脑没声音,更新驱动以及万不得已下载驱动精灵都没有解决. 后来发现在“硬件和声音”中没有Realtek高清音频管理器,之后找到解决办法如下: 1. 找到Realtek高清音频 ...

  4. Ubuntu 18.04图形化软件包管理器

    1.ubuntu软件这个管理工具提供了一种管理您系统中软件的好方法,通过他可以很直观的查找软件安装很简单,打开终端,输入以下命令:----------------------------------- ...

  5. 04 Vue Router路由管理器

    路由的基本概念与原理 Vue Router Vue Router (官网: https://router.vuejs.org/zh/)是Vue.js 官方的路由管理器. 它和vue.js的核心深度集成 ...

  6. 翻译《Writing Idiomatic Python》(五):类、上下文管理器、生成器

    原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ 上一篇:翻译<Writing Idiomatic ...

  7. Oracle 11g 中恢复管理器RMAN介绍

    这是我平时摘录的笔记,从管理艺术那本书上摘录出来的,放到这里 RMAN 可在数据库服务器的帮助下从数据库内备份数据文件,可构造数据文件映像副本.控制文件和控制文件映像.对当日志 SPFILE 和RMA ...

  8. 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。

    今天写ASP.NET程序,在网页后台的c#代码里写了个事务,事务内部对一张表进行批量插入,对另外一张表进行查询与批量插入. 结果第二张表查询后foreach迭代操作时报错:已禁用对分布式事务管理器(M ...

  9. AudioManager音频管理器

    AudioManager音频管理器提供了如下几种常用方法来控制手机音频: 1.adjustStreamVolume(int StreamType,int direction,int flgs):调整手 ...

随机推荐

  1. Git版本回退的最佳方式

    使用git开发的过程中,存在误提交的时候怎么办呢?不用慌张,强大的git提供了两种版本回退的方式,可以让你恢复提交之前的内容: 方式一:reset(不推荐) 通过reset的方式,把head指针指向之 ...

  2. bzoj 2762: [JLOI2011]不等式组——树状数组

    旺汪与旺喵最近在做一些不等式的练习.这些不等式都是形如ax+b>c 的一元不等式.当然,解这些不等式对旺汪来说太简单了,所以旺喵想挑战旺汪.旺喵给出一组一元不等式,并给出一个数值 .旺汪需要回答 ...

  3. 第八周 yukun 20155335

  4. div 超出高度滚动条,超出宽度点点点

    超出高度滚动条 style="width:230px; height: 180px; overflow: auto;" 超出宽度点点点 style="width: 220 ...

  5. 制作Solaris系统的USB启动盘

    制作方法: 1. wget http://192.168.2.5/surefiler-installer/2011-12-09/devel-2011.12.9.tgz 2. cd /root tar  ...

  6. highcharts 从后台动态改变数据

    //columnChart    图表对象,创建示例就展示了. var series = this.columnChart.series;                            whi ...

  7. php伪协议

    文件包含函数:include.require.include_once.require_once.highlight_file .show_source .readfile .file_get_con ...

  8. HighGUI图形图像界面初步——鼠标操作

    OpenCV中的鼠标操作和滑动条的消息映射方式很类似,都是通过一个中介函数配合一个回调函数来实现的,创建和指定滑动条回调函数为createTrackbar, 而指定鼠标操作消息回调函数的函数为setM ...

  9. JS中类型检测方式

    在js中的类型检测目前我所知道的是三种方式,分别有它们的应用场景: 1.typeof:主要用于检测基本类型. typeof undefined;//=> undefined typeof 'a' ...

  10. POJ 3308

    http://poj.org/problem?id=3308 考虑答案不是乘积而是和的做法, 因为对于每一个伞兵我们要么在这行内安装大炮消灭它 要么在这列中安装大炮消灭它,所以容易看出这是一个最小边覆 ...