using SRF; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.Audio; //声音管理器 public class AudioManager : MonoSingleton { private Queue _CVFiles = new Queue(); private AudioSource _cvSource; private AudioSource _seSource; private AudioSource _bgmSource; private readonly float _cvCDTime = 0.2f; private float _cvCDTimer = 0; //音乐音量 private float _musicVolume; private float _cvVolume; private Queue<(string, AudioClip)> _cacheMusicSource = new Queue<(string, AudioClip)>(); private const int _musciSourceCacheNumber = 20; public float MusicVolume { get => _musicVolume; set => _musicVolume = value; } private float _seVolume; public float SEVolume { get => _seVolume; set => _seVolume = value; } public float CVVolume { get => _cvVolume; set => _cvVolume = value; } public override void Init() { _cvSource = GetAudioSource("CVSource"); _seSource = GetAudioSource("SESource"); _bgmSource = GetAudioSource("BGMSource"); } private AudioSource GetAudioSource(string name) { var transAS = transform.Find(name); AudioSource retVal; if (transAS != null) { retVal = transAS.GetComponent(); } else { GameObject asGo = new GameObject(name); asGo.transform.SetParent(transform); retVal = asGo.GetComponentOrAdd(); retVal.name = name; } return retVal; } //播放音乐 public void PlayMusic(string name) { } public void PlaySE(string name) { var clip = GetAudioClip("SE", name); _seSource.clip = clip; _seSource.Play(); } public void PlayCV(string name) { } public void PlayCVInQueue(string name) { _CVFiles.Enqueue(name); } private void Update() { //播放队列中音频 if (_CVFiles.Count > 0) { //正在播放 if (_cvSource.isPlaying) { return; } //播放完成后等待0.5秒 if (_cvCDTimer < _cvCDTime) { _cvCDTimer += Time.deltaTime; return; } _cvCDTimer = 0; var name = _CVFiles.Dequeue(); var clip = GetAudioClip("CV", name); _cvSource.clip = clip; _cvSource.Play(); } } public void StopMusic() { } public void StopSE() { _seSource.Stop(); } public void StopCV() { } /// /// 获取音频文件 /// 总缓存10个 /// /// /// /// private AudioClip GetAudioClip(string type, string path) { var retVal = _cacheMusicSource.ToArray().ToList().Find(x => x.Item1.Equals($"{type}/{path}")); if (retVal.Item2 != null) { return retVal.Item2; } var clip = Resources.Load($"{type}/{path}"); if (clip == null) { LogPrint.Error($"AudioClip {type}/{path} is not exist!"); return null; } _cacheMusicSource.Enqueue(($"{type}/{path}", clip)); if (_cacheMusicSource.Count > _musciSourceCacheNumber) { var tmp = _cacheMusicSource.Dequeue(); Resources.UnloadAsset(tmp.Item2); } return clip; } }