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(); } }