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