Health/Assets/Scripts/Service/AudioManager.cs

163 lines
3.7 KiB
C#

using SRF;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Audio;
//声音管理器
public class AudioManager : MonoSingleton<AudioManager>
{
private Queue<string> _CVFiles = new Queue<string>();
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<AudioSource>();
}
else
{
GameObject asGo = new GameObject(name);
asGo.transform.SetParent(transform);
retVal = asGo.GetComponentOrAdd<AudioSource>();
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()
{
}
/// <summary>
/// 获取音频文件
/// 总缓存10个
/// </summary>
/// <param name="type"></param>
/// <param name="path"></param>
/// <returns></returns>
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<AudioClip>($"{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;
}
}