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