163 lines
3.7 KiB
C#
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;
|
|
}
|
|
}
|