using UnityEngine; /// /// 音频管理器:管理背景音乐和步骤语音解说。 /// 挂在场景 GameObject 上,通过 AudioSource 组件播放。 /// [RequireComponent(typeof(AudioSource))] public class AudioManager : MonoBehaviour { public static AudioManager Instance { get; private set; } [Header("音频源")] [SerializeField] private AudioSource _bgmSource; [SerializeField] private AudioSource _voiceSource; [Header("背景音乐")] public AudioClip BGMClip; [Range(0f, 1f)] public float BGMVolume = 0.3f; private void Awake() { if (Instance != null) { Destroy(gameObject); return; } Instance = this; DontDestroyOnLoad(gameObject); if (_bgmSource == null) _bgmSource = GetComponent(); if (_voiceSource == null) { _voiceSource = gameObject.AddComponent(); _voiceSource.playOnAwake = false; _voiceSource.loop = false; } } private void Start() { PlayBGM(); } public void PlayBGM() { if (_bgmSource == null || BGMClip == null) return; _bgmSource.clip = BGMClip; _bgmSource.volume = BGMVolume; _bgmSource.loop = true; _bgmSource.Play(); } public void StopBGM() { if (_bgmSource != null) _bgmSource.Stop(); } /// 播放一步语音解说,自动打断前一条 public void PlayVoice(AudioClip clip, float volume = 1f) { if (_voiceSource == null || clip == null) return; _voiceSource.Stop(); _voiceSource.clip = clip; _voiceSource.volume = volume; _voiceSource.Play(); } /// 停止语音 public void StopVoice() { if (_voiceSource != null) _voiceSource.Stop(); } /// 按文件名从 StreamingAssets 加载并播放语音 public void PlayVoiceFromFile(string fileName) { if (string.IsNullOrEmpty(fileName)) return; StartCoroutine(LoadAndPlayVoice(fileName)); } private System.Collections.IEnumerator LoadAndPlayVoice(string fileName) { string path = System.IO.Path.Combine(Application.streamingAssetsPath, "Voice", fileName); using var www = UnityEngine.Networking.UnityWebRequestMultimedia.GetAudioClip(path, AudioType.WAV); yield return www.SendWebRequest(); if (www.result == UnityEngine.Networking.UnityWebRequest.Result.Success) { var clip = UnityEngine.Networking.DownloadHandlerAudioClip.GetContent(www); PlayVoice(clip); } else { Debug.LogWarning($"AudioManager: 加载语音失败 {path}"); } } }