OvertakingLegend/Assets/Script/Tool/AudioManager.cs

292 lines
8.1 KiB
C#

using DG.Tweening;
using System;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
/// <summary>
/// 音效管理
/// </summary>
public class AudioManager : MBSingletonManager<AudioManager>
{
/// <summary>
/// 是否交替
/// </summary>
private bool isAlternate;
/// <summary>
///循环音效字典
/// </summary>
private Dictionary<string, AudioSource> circulateAudioDic = new Dictionary<string, AudioSource>();
/// <summary>
/// 背景音乐
/// </summary>
[SerializeField] private AudioSource backgroundMusic;
/// <summary>
/// 音效音频源1
/// </summary>
[SerializeField] private AudioSource soundEffectsourceOne;
/// <summary>
/// 音效音频源2
/// </summary>
[SerializeField] private AudioSource soundEffectsourceTwo;
private void Awake()
{
GenerateKarma();
}
private void Start()
{
Init();
}
/// <summary>
/// 生成音源
/// </summary>
private void GenerateKarma()
{
backgroundMusic = this.AddComponent<AudioSource>();
backgroundMusic.playOnAwake = true;
backgroundMusic.loop = true;
soundEffectsourceOne = this.AddComponent<AudioSource>();
soundEffectsourceOne.playOnAwake = false;
soundEffectsourceTwo = this.AddComponent<AudioSource>();
soundEffectsourceTwo.playOnAwake= false;
}
/// <summary>
/// 初始化
/// </summary>
private void Init()
{
backgroundMusic.volume = UserDataManager.Instance.userData.soundSwitchData.bKMusicVolume;
SetBkMusicClip();
SetAllSEAudio();
}
/// <summary>
/// 设置背景音乐
/// </summary>
/// <param name="audioClip">背景音乐</param>
public void SetBackgroundMusic(AudioClip audioClip)
{
backgroundMusic.clip = audioClip;
SetBkMusicClip();
}
/// <summary>
/// 播放背景音乐
/// </summary>
public void SetBkMusicClip()
{
if (UserDataManager.Instance.userData.soundSwitchData.isOpenBKMusic)
{
backgroundMusic.Play();
}
else
{
backgroundMusic.Stop();
}
}
/// <summary>
/// 设置背景音乐
/// </summary>
public void SetBkMusic(bool isOpen,float fadeTime)
{
if (UserDataManager.Instance.userData.soundSwitchData.isOpenBKMusic)
{
if (isOpen)
{
float volume = 0;
backgroundMusic.Play();
DOTween.To(() => volume, x => volume = x, 1, fadeTime).OnUpdate(() =>
{
backgroundMusic.volume = volume;
});
}
else
{
float volume = 1;
DOTween.To(() => volume, x => volume = x, 0, fadeTime).OnUpdate(() =>
{
backgroundMusic.volume = volume;
}).OnComplete(() =>
{
backgroundMusic.Pause();
});
}
}
}
/// <summary>
/// 设置背景音乐大小
/// </summary>
/// <param name="value"></param>
public void SetBKMusicVolume(float value)
{
backgroundMusic.volume = value;
UserDataManager.Instance.SetBKMusicVolume(value);
}
/// <summary>
/// 设置音效大小
/// </summary>
public void SetSEVolume(float value)
{
UserDataManager.Instance.SetSEVolume(value);
SetAllSEAudio();
}
/// <summary>
/// 设置所有音源音效大小
/// </summary>
public void SetAllSEAudio()
{
foreach (var item in circulateAudioDic)
{
if (UserDataManager.Instance.userData.soundSwitchData.isOpenSEMusic)
{
circulateAudioDic[item.Key].volume = UserDataManager.Instance.userData.soundSwitchData.sEVolume;
}
else
{
circulateAudioDic[item.Key].volume = 0;
}
}
soundEffectsourceOne.volume = UserDataManager.Instance.userData.soundSwitchData.sEVolume;
soundEffectsourceTwo.volume = UserDataManager.Instance.userData.soundSwitchData.sEVolume;
}
/// <summary>
/// 播放音效
/// </summary>
/// <param name="clip">音效</param>
/// <param name="isCirculate">是否循环</param>
/// <param name="isShank">是否震动</param>
public void PlaySound(AudioClip clip, bool isCirculate = false, bool isShank = true)
{
if (circulateAudioDic.ContainsKey(clip.name)) return;
isAlternate = !isAlternate;
Shank(isShank);
if (isCirculate)
{
AudioSource audioSource = this.gameObject.AddComponent<AudioSource>();
audioSource.clip = clip;
audioSource.loop = true;
audioSource.Play();
circulateAudioDic.Add(clip.name, audioSource);
audioSource.volume = UserDataManager.Instance.userData.soundSwitchData.isOpenSEMusic ? UserDataManager.Instance.userData.soundSwitchData.sEVolume: 0;
}
else
{
if (UserDataManager.Instance.userData.soundSwitchData.isOpenSEMusic)
{
if (isAlternate)
{
soundEffectsourceOne.PlayOneShot(clip);
}
else
{
soundEffectsourceTwo.PlayOneShot(clip);
}
}
}
}
/// <summary>
/// 播放3D音效
/// </summary>
/// <param name="obj">挂载对象</param>
/// <param name="clip">音频</param>
/// <param name="isCirculate">是否循环</param>
/// <param name="isShank">是否震动</param>
public void Play3DSound(GameObject obj,AudioClip clip,bool isCirculate=false,bool isShank=true)
{
Shank(isShank);
AudioSource audioSource = obj.AddComponent<AudioSource>();
audioSource.clip = clip;
audioSource.spatialBlend = 1;
audioSource.loop = isCirculate;
audioSource.Play();
if(isCirculate)
{
circulateAudioDic.Add(clip.name, audioSource);
}
audioSource.volume = UserDataManager.Instance.userData.soundSwitchData.isOpenSEMusic ? UserDataManager.Instance.userData.soundSwitchData.sEVolume : 0;
}
/// <summary>
/// 震动
/// </summary>
/// <param name="isShank">是否震动</param>
public void Shank(bool isShank)
{
#if UNITY_ANDROID || UNITY_IOS
if (isShank)
{
CommonMethods.Instance.CellPhoneShank();
}
#endif
}
/// <summary>
/// 关闭指定循环音效
/// </summary>
/// <param name="name">音效名字</param>
/// <param name="isFade">是否渐渐淡出</param>
/// <param name="fadeTime">淡出时间</param>
public void ClearIndividually(string name, bool isFade=false,float fadeTime=0)
{
if (circulateAudioDic.ContainsKey(name))
{
float volume = 1;
if (isFade)
{
DOTween.To(() => volume, x => volume = x, 0, fadeTime).OnUpdate(() =>
{
circulateAudioDic[name].volume = volume;
}).OnComplete(() =>
{
if (volume <= 0)
{
Destroy(circulateAudioDic[name]);
circulateAudioDic.Remove(name);
}
}).SetUpdate(true);
}
else
{
volume = 0;
}
if (volume <= 0)
{
Destroy(circulateAudioDic[name]);
circulateAudioDic.Remove(name);
}
}
}
/// <summary>
/// 清空
/// </summary>
public void ClearAll()
{
foreach (var item in circulateAudioDic)
{
Destroy(circulateAudioDic[item.Key]);
}
circulateAudioDic.Clear();
}
}