using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.Networking; /// /// 音频帮助类 /// public class AudioHelper { #region 私有属性 /// /// 音频组件名称 /// private static string m_AudioComponentName = "AudioHelper"; /// /// 当前音频组件 /// private static AudioSource m_CurrentAudoiSource = null; private static float m_RecordCurrentVolume = 0; private const float m_VolumeOffset = 0.1f; #endregion /// /// 获取音频组件 /// public static void GetAudioComponent() { // 根据名称全局查找音频播放组件 GameObject tmpGame = GameObject.Find(m_AudioComponentName); if (tmpGame == null) { tmpGame = new GameObject(m_AudioComponentName); } if (tmpGame.GetComponent() == null) { tmpGame.AddComponent(); } AudioSource audioSource = tmpGame.GetComponent(); // 设置最大、最小半径 audioSource.minDistance = 50; audioSource.maxDistance = 500; m_CurrentAudoiSource = audioSource; } public static void AudioPause() { if (m_CurrentAudoiSource != null) { m_CurrentAudoiSource.Pause(); } } public static void AudioPlay() { if (m_CurrentAudoiSource != null) { m_CurrentAudoiSource.Play(); } } public static void SetAudioVolume(float _volume) { if (m_CurrentAudoiSource != null) { m_CurrentAudoiSource.volume = _volume; } } public static void AudioStop() { if (m_CurrentAudoiSource != null) { m_CurrentAudoiSource.Stop(); } } /// /// 播放音频 /// /// public static IEnumerator PlayAudio(AudioClip audioClip, Action playFinishCall = null) { ClearCrrentAudioSource(); if (m_CurrentAudoiSource != null && audioClip != null) { // 先停止 m_CurrentAudoiSource.Stop(); // 再清空一次 m_CurrentAudoiSource.clip = null; // 然后在赋值 m_CurrentAudoiSource.clip = audioClip; // 先暂停,然后播放 m_CurrentAudoiSource.Stop(); m_CurrentAudoiSource.Play(); yield return new WaitForSeconds(audioClip.length); playFinishCall?.Invoke(); } else { yield return new WaitForSeconds(9f); playFinishCall?.Invoke(); } } /// /// 清空当前的播放 /// private static void ClearCrrentAudioSource() { if (m_CurrentAudoiSource != null) { if (m_CurrentAudoiSource.isPlaying) m_CurrentAudoiSource.Stop(); m_CurrentAudoiSource.clip = null; } } /// /// 加载指定音频文件 /// /// /// /// public static IEnumerator LoadSpecifiedAudioFile(string _folderName, string _audioName) { // 合并完整路径信息 string audioPath = PathHelper.CombineFilePath(PathHelper.m_ReadOnlyPath, _folderName, _audioName); // 判断文件是否存在 if (File.Exists(audioPath)) { using (UnityWebRequest webRequest = UnityWebRequestMultimedia.GetAudioClip(audioPath, AudioType.MPEG)) { yield return webRequest.SendWebRequest(); if (webRequest.isHttpError || webRequest.isNetworkError) { Debug.LogError("音频文件加载出错!"); } else { // 获取到 AudioClip AudioClip audioClip = DownloadHandlerAudioClip.GetContent(webRequest); if (m_CurrentAudoiSource == null) { GetAudioComponent(); } if (m_CurrentAudoiSource != null) { // 先停止 m_CurrentAudoiSource.Stop(); // 再清空一次 m_CurrentAudoiSource.clip = null; // 然后在赋值 m_CurrentAudoiSource.clip = audioClip; // 先暂停,然后播放 m_CurrentAudoiSource.Stop(); m_CurrentAudoiSource.Play(); } } } } else { Debug.LogError("缺少音频文件:" + _audioName); } } /// /// 加载单个音频文件 /// /// 音频文件名字 public static IEnumerator LoadAudioClip(string deviceName, string clipName, AudioType type, Action callBack) { string extension = string.Empty; switch (type) { case AudioType.MPEG: extension = ".mp3"; break; case AudioType.WAV: extension = ".wav"; break; case AudioType.VAG: extension = ".vag"; break; } var path = PathHelper.CombineFilePath(PathHelper.m_ReadOnlyPath, "Config","Audios", deviceName, clipName + extension); if (File.Exists(path)) { UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip(path, type); yield return request.SendWebRequest(); if (request.isHttpError || request.isNetworkError) { Debug.LogError("加载出错!" + request.error); callBack?.Invoke(null); } else { callBack?.Invoke(DownloadHandlerAudioClip.GetContent(request)); } } else { callBack?.Invoke(null); Debug.LogError("缺少音频文件:" + clipName + extension); } } /// /// 加载音频文件 /// /// /// /// /// public static IEnumerator LoadSpecifiedAudioFile(string _folderName, string _audioName, Action loadCallBack) { AudioClip tmpAudioClip = null; // 合并完整路径信息 string audioPath = PathHelper.CombineFilePath(PathHelper.m_ReadOnlyPath, _folderName, _audioName); // 判断文件是否存在 if (File.Exists(audioPath)) { using (UnityWebRequest webRequest = UnityWebRequestMultimedia.GetAudioClip(audioPath, AudioType.MPEG)) { yield return webRequest.SendWebRequest(); if (webRequest.isHttpError || webRequest.isNetworkError) { Debug.LogError("音频文件加载出错!"); loadCallBack.Invoke(tmpAudioClip); } else { // 获取到 AudioClip tmpAudioClip = DownloadHandlerAudioClip.GetContent(webRequest); loadCallBack.Invoke(tmpAudioClip); } } } else { Debug.LogError("缺少音频文件:" + _audioName); loadCallBack.Invoke(tmpAudioClip); } } /// /// 获取当前音频播放器 /// /// public static AudioSource GetCurrentAudioSource() { return m_CurrentAudoiSource; } }