OvertakingLegend/Assets/Script/Tool/AudioManager.cs

292 lines
8.1 KiB
C#
Raw Normal View History

2025-03-24 03:08:22 +00:00
using DG.Tweening;
using System;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
/// <summary>
/// <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
/// </summary>
public class AudioManager : MBSingletonManager<AudioManager>
{
/// <summary>
/// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
private bool isAlternate;
/// <summary>
///ѭ<><D1AD><EFBFBD><EFBFBD>Ч<EFBFBD>ֵ<EFBFBD>
/// </summary>
private Dictionary<string, AudioSource> circulateAudioDic = new Dictionary<string, AudioSource>();
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
[SerializeField] private AudioSource backgroundMusic;
/// <summary>
/// <20><>Ч<EFBFBD><D0A7>ƵԴ1
/// </summary>
[SerializeField] private AudioSource soundEffectsourceOne;
/// <summary>
/// <20><>Ч<EFBFBD><D0A7>ƵԴ2
/// </summary>
[SerializeField] private AudioSource soundEffectsourceTwo;
private void Awake()
{
GenerateKarma();
}
private void Start()
{
Init();
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
/// </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>
/// <20><>ʼ<EFBFBD><CABC>
/// </summary>
private void Init()
{
backgroundMusic.volume = UserDataManager.Instance.userData.soundSwitchData.bKMusicVolume;
SetBkMusicClip();
SetAllSEAudio();
}
/// <summary>
/// <20><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="audioClip"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
public void SetBackgroundMusic(AudioClip audioClip)
{
backgroundMusic.clip = audioClip;
SetBkMusicClip();
}
/// <summary>
/// <20><><EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public void SetBkMusicClip()
{
if (UserDataManager.Instance.userData.soundSwitchData.isOpenBKMusic)
{
backgroundMusic.Play();
}
else
{
backgroundMusic.Stop();
}
}
/// <summary>
/// <20><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </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>
/// <20><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>С
/// </summary>
/// <param name="value"></param>
public void SetBKMusicVolume(float value)
{
backgroundMusic.volume = value;
UserDataManager.Instance.SetBKMusicVolume(value);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>С
/// </summary>
public void SetSEVolume(float value)
{
UserDataManager.Instance.SetSEVolume(value);
SetAllSEAudio();
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>Ч<EFBFBD><D0A7>С
/// </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>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
/// </summary>
/// <param name="clip"><3E><>Ч</param>
/// <param name="isCirculate"><3E>Ƿ<EFBFBD>ѭ<EFBFBD><D1AD></param>
/// <param name="isShank"><3E>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD></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>
/// <20><><EFBFBD><EFBFBD>3D<33><44>Ч
/// </summary>
/// <param name="obj"><3E><><EFBFBD>ض<EFBFBD><D8B6><EFBFBD></param>
/// <param name="clip"><3E><>Ƶ</param>
/// <param name="isCirculate"><3E>Ƿ<EFBFBD>ѭ<EFBFBD><D1AD></param>
/// <param name="isShank"><3E>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD></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>
/// <20><><EFBFBD><EFBFBD>
/// </summary>
/// <param name="isShank"><3E>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD></param>
public void Shank(bool isShank)
{
#if UNITY_ANDROID || UNITY_IOS
if (isShank)
{
CommonMethods.Instance.CellPhoneShank();
}
#endif
}
/// <summary>
/// <20>ر<EFBFBD>ָ<EFBFBD><D6B8>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>Ч
/// </summary>
/// <param name="name"><3E><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD></param>
/// <param name="isFade"><3E>Ƿ񽥽<C7B7><F1BDA5BD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="fadeTime"><3E><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1></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>
/// <20><><EFBFBD><EFBFBD>
/// </summary>
public void ClearAll()
{
foreach (var item in circulateAudioDic)
{
Destroy(circulateAudioDic[item.Key]);
}
circulateAudioDic.Clear();
}
}