AudioHelper.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using UnityEngine;
  6. using UnityEngine.Networking;
  7. /// <summary>
  8. /// 音频帮助类
  9. /// </summary>
  10. public class AudioHelper
  11. {
  12. #region 私有属性
  13. /// <summary>
  14. /// 音频组件名称
  15. /// </summary>
  16. private static string m_AudioComponentName = "AudioHelper";
  17. /// <summary>
  18. /// 当前音频组件
  19. /// </summary>
  20. private static AudioSource m_CurrentAudoiSource = null;
  21. private static float m_RecordCurrentVolume = 0;
  22. private const float m_VolumeOffset = 0.1f;
  23. #endregion
  24. /// <summary>
  25. /// 获取音频组件
  26. /// </summary>
  27. public static void GetAudioComponent()
  28. {
  29. // 根据名称全局查找音频播放组件
  30. GameObject tmpGame = GameObject.Find(m_AudioComponentName);
  31. if (tmpGame == null)
  32. {
  33. tmpGame = new GameObject(m_AudioComponentName);
  34. }
  35. if (tmpGame.GetComponent<AudioSource>() == null)
  36. {
  37. tmpGame.AddComponent<AudioSource>();
  38. }
  39. AudioSource audioSource = tmpGame.GetComponent<AudioSource>();
  40. // 设置最大、最小半径
  41. audioSource.minDistance = 50;
  42. audioSource.maxDistance = 500;
  43. m_CurrentAudoiSource = audioSource;
  44. }
  45. /// <summary>
  46. /// 音频暂停
  47. /// </summary>
  48. public static void AudioPause()
  49. {
  50. if (m_CurrentAudoiSource != null)
  51. {
  52. m_CurrentAudoiSource.Pause();
  53. }
  54. }
  55. /// <summary>
  56. /// 继续播放
  57. /// </summary>
  58. public static void AudioUnPause()
  59. {
  60. if (m_CurrentAudoiSource != null)
  61. {
  62. m_CurrentAudoiSource.UnPause();
  63. }
  64. }
  65. /// <summary>
  66. /// 音频播放
  67. /// </summary>
  68. public static void AudioPlay()
  69. {
  70. if (m_CurrentAudoiSource != null)
  71. {
  72. m_CurrentAudoiSource.Play();
  73. }
  74. }
  75. /// <summary>
  76. /// 设置音频音量
  77. /// </summary>
  78. /// <param name="_volume"></param>
  79. public static void SetAudioVolume(float _volume)
  80. {
  81. if (m_CurrentAudoiSource != null)
  82. {
  83. m_CurrentAudoiSource.volume = _volume;
  84. }
  85. }
  86. /// <summary>
  87. /// 停止播放
  88. /// </summary>
  89. public static void AudioStop()
  90. {
  91. if (m_CurrentAudoiSource != null)
  92. {
  93. m_CurrentAudoiSource.Stop();
  94. }
  95. }
  96. /// <summary>
  97. /// 播放音频
  98. /// </summary>
  99. /// <param name="audioClip"></param>
  100. public static IEnumerator PlayAudio(AudioClip audioClip, Action playFinishCall = null)
  101. {
  102. ClearCrrentAudioSource();
  103. if (m_CurrentAudoiSource != null && audioClip != null)
  104. {
  105. // 先停止
  106. m_CurrentAudoiSource.Stop();
  107. // 再清空一次
  108. m_CurrentAudoiSource.clip = null;
  109. // 然后在赋值
  110. m_CurrentAudoiSource.clip = audioClip;
  111. // 先暂停,然后播放
  112. m_CurrentAudoiSource.Stop();
  113. m_CurrentAudoiSource.Play();
  114. yield return new WaitForSeconds(audioClip.length);
  115. playFinishCall?.Invoke();
  116. }
  117. else
  118. {
  119. yield return new WaitForSeconds(9f);
  120. playFinishCall?.Invoke();
  121. }
  122. }
  123. /// <summary>
  124. /// 清空当前的播放
  125. /// </summary>
  126. private static void ClearCrrentAudioSource()
  127. {
  128. if (m_CurrentAudoiSource != null)
  129. {
  130. if (m_CurrentAudoiSource.isPlaying) m_CurrentAudoiSource.Stop();
  131. m_CurrentAudoiSource.clip = null;
  132. }
  133. }
  134. /// <summary>
  135. /// 加载指定音频文件
  136. /// </summary>
  137. /// <param name="_folderName"></param>
  138. /// <param name="_audioName"></param>
  139. /// <returns></returns>
  140. public static IEnumerator LoadSpecifiedAudioFile(string _folderName, string _audioName,Action<float> audioClipLengthCall = null,Action audioPlayFinishCall = null)
  141. {
  142. // 合并完整路径信息
  143. string audioPath = PathHelper.CombineFilePath(PathHelper.m_ReadOnlyPath, _folderName, _audioName + ".mp3");
  144. // 判断文件是否存在
  145. if (File.Exists(audioPath))
  146. {
  147. using (UnityWebRequest webRequest = UnityWebRequestMultimedia.GetAudioClip(audioPath, AudioType.MPEG))
  148. {
  149. yield return webRequest.SendWebRequest();
  150. if (webRequest.isHttpError || webRequest.isNetworkError)
  151. {
  152. Debug.LogError("音频文件加载出错!");
  153. }
  154. else
  155. {
  156. // 获取到 AudioClip
  157. AudioClip audioClip = DownloadHandlerAudioClip.GetContent(webRequest);
  158. if (audioClip != null)
  159. {
  160. audioClipLengthCall?.Invoke(audioClip.length);
  161. }else
  162. {
  163. audioClipLengthCall?.Invoke(0);
  164. }
  165. if (m_CurrentAudoiSource == null)
  166. {
  167. GetAudioComponent();
  168. }
  169. if (m_CurrentAudoiSource != null)
  170. {
  171. // 先停止
  172. m_CurrentAudoiSource.Stop();
  173. // 再清空一次
  174. m_CurrentAudoiSource.clip = null;
  175. // 然后在赋值
  176. m_CurrentAudoiSource.clip = audioClip;
  177. // 先暂停,然后播放
  178. m_CurrentAudoiSource.Stop();
  179. m_CurrentAudoiSource.Play();
  180. yield return new WaitForSeconds(audioClip.length);
  181. audioPlayFinishCall?.Invoke();
  182. }
  183. }
  184. }
  185. }
  186. else
  187. {
  188. Debug.LogError("缺少音频文件:" + audioPath);
  189. }
  190. }
  191. /// <summary>
  192. /// 加载单个音频文件
  193. /// </summary>
  194. /// <param name="clipName">音频文件名字</param>
  195. public static IEnumerator LoadAudioClip(string deviceName, string clipName, AudioType type, Action<AudioClip> callBack)
  196. {
  197. string extension = string.Empty;
  198. switch (type)
  199. {
  200. case AudioType.MPEG:
  201. extension = ".mp3";
  202. break;
  203. case AudioType.WAV:
  204. extension = ".wav";
  205. break;
  206. case AudioType.VAG:
  207. extension = ".vag";
  208. break;
  209. }
  210. var path = PathHelper.CombineFilePath(PathHelper.m_ReadOnlyPath, "Config","Audios", deviceName, clipName + extension);
  211. if (File.Exists(path))
  212. {
  213. UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip(path, type);
  214. yield return request.SendWebRequest();
  215. if (request.isHttpError || request.isNetworkError)
  216. {
  217. Debug.LogError("加载出错!" + request.error);
  218. callBack?.Invoke(null);
  219. }
  220. else
  221. {
  222. callBack?.Invoke(DownloadHandlerAudioClip.GetContent(request));
  223. }
  224. }
  225. else
  226. {
  227. callBack?.Invoke(null);
  228. Debug.LogError("缺少音频文件:" + clipName + extension);
  229. }
  230. }
  231. /// <summary>
  232. /// 加载音频文件
  233. /// </summary>
  234. /// <param name="_folderName"></param>
  235. /// <param name="_audioName"></param>
  236. /// <param name="loadCallBack"></param>
  237. /// <returns></returns>
  238. public static IEnumerator LoadSpecifiedAudioFile(string _folderName, string _audioName, Action<AudioClip> loadCallBack)
  239. {
  240. AudioClip tmpAudioClip = null;
  241. // 合并完整路径信息
  242. string audioPath = PathHelper.CombineFilePath(PathHelper.m_ReadOnlyPath, _folderName, _audioName);
  243. // 判断文件是否存在
  244. if (File.Exists(audioPath))
  245. {
  246. using (UnityWebRequest webRequest = UnityWebRequestMultimedia.GetAudioClip(audioPath, AudioType.MPEG))
  247. {
  248. yield return webRequest.SendWebRequest();
  249. if (webRequest.isHttpError || webRequest.isNetworkError)
  250. {
  251. Debug.LogError("音频文件加载出错!");
  252. loadCallBack.Invoke(tmpAudioClip);
  253. }
  254. else
  255. {
  256. // 获取到 AudioClip
  257. tmpAudioClip = DownloadHandlerAudioClip.GetContent(webRequest);
  258. loadCallBack.Invoke(tmpAudioClip);
  259. }
  260. }
  261. }
  262. else
  263. {
  264. Debug.LogError("缺少音频文件:" + _audioName);
  265. loadCallBack.Invoke(tmpAudioClip);
  266. }
  267. }
  268. /// <summary>
  269. /// 获取当前音频播放器
  270. /// </summary>
  271. /// <returns></returns>
  272. public static AudioSource GetCurrentAudioSource()
  273. {
  274. return m_CurrentAudoiSource;
  275. }
  276. }