292 lines
8.1 KiB
C#
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();
|
|
}
|
|
}
|