NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Framework/Audio/AudioManager.cs

322 lines
8.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using Cysharp.Threading.Tasks;
using PhxhSDK;
using UnityEngine;
using UnityEngine.Audio;
// public enum EPlayType
// {
// Music,
// Sound,
// Speak
// }
public class AudioManager: Singlenton<AudioManager>, IStart, IInitable, IUpdatable, IAudioPlay
{
private AudioUnityManager _audioMgrObj = new();
public GameObject initGameObject;
public static bool DisableAudio = false;
private bool isPlayingAlbum = false;
public bool IsPlayingAlbum
{
get
{
return isPlayingAlbum;
}
set
{
isPlayingAlbum = value;
}
}
public bool IsPlayingBGM { get; set; }
public AudioUnityManager AudioMgrObj
{
get { return _audioMgrObj; }
}
//public AudioMixer masterMixer => _audioMgrObj.masterMixer;
private void AfterSwitchCamera(bool isRegister = true)
{
if (isRegister)
{
CameraManager.Instance.AfterSwitchMainCamera += _audioMgrObj.AfterSwitchMainCamera;
}
else
{
CameraManager.Instance.AfterSwitchMainCamera -= _audioMgrObj.AfterSwitchMainCamera;
}
}
public void Init()
{
_audioMgrObj.Init();
AfterSwitchCamera();
}
public void Release()
{
_audioMgrObj.Release();
AfterSwitchCamera(false);
}
public void Start()
{
_audioMgrObj.Start();
initGameObject = initGameObject;
}
public void Update(float dt)
{
_audioMgrObj.Update(dt);
}
public float GlobalVolume
{
get { return _audioMgrObj.GlobalVolume; }
set { _audioMgrObj.GlobalVolume = value; }
}
public float GlobalMusicVolume
{
get { return _audioMgrObj.GlobalMusicVolume; }
set { _audioMgrObj.GlobalMusicVolume = value; }
}
public float GlobalSoundsVolume
{
get { return _audioMgrObj.GlobalSoundsVolume; }
set { _audioMgrObj.GlobalSoundsVolume = value; }
}
public bool GlobalIsSpeakOpen
{
get { return _audioMgrObj.GlobalIsOpenSpeak; }
set { _audioMgrObj.GlobalIsOpenSpeak = value; }
}
public float GlobalSpeakVolume
{
get { return _audioMgrObj.GlobalSpeakVolume; }
set { _audioMgrObj.GlobalSpeakVolume = value; }
}
public void SetMusicEnable(bool isEnable)
{
GlobalMusicVolume = isEnable ? 1 : 0;
}
public void SetSoundEnable(bool isEnable)
{
GlobalSoundsVolume = isEnable ? 1 : 0;
}
public async UniTask<float> GetClipLength(string key)
{
return await _audioMgrObj.GetClipLength(key);
}
#region 流式播放
public int PlayAudio(string key, AudioCriManager.EPlayType type = AudioCriManager.EPlayType.Sound,
GameObject posObj = null, bool loop = false, int priority = AudioConstant.DefaultPriority, bool isFade = false)
{
if (type == AudioCriManager.EPlayType.Music)
{
//如果使用单个audio播放music可能会顶掉原先播放的专辑音乐
//在这里将专辑音乐标记为false
IsPlayingAlbum = false;
IsPlayingBGM = false;
}
return _audioMgrObj.PlayAudio(key, type, posObj, loop, priority, isFade);
}
public int PlayAudio(string key, Vector3 pos, AudioCriManager.EPlayType type = AudioCriManager.EPlayType.Sound, bool loop = false,
int priority = AudioConstant.DefaultPriority, bool isFade = false)
{
if (type == AudioCriManager.EPlayType.Music)
{
//如果使用单个audio播放music可能会顶掉原先播放的专辑音乐
//在这里将专辑音乐标记为false
IsPlayingAlbum = false;
IsPlayingBGM = false;
}
return _audioMgrObj.PlayAudio(key, type, pos, loop, priority, isFade);
}
#endregion
public void StopByID(int id)
{
if (DisableAudio)
return;
_audioMgrObj.StopByID(id);
}
public void StopWithFadeByID(int id, float fadeOutTime = 1f)
{
if (DisableAudio) return;
_audioMgrObj.StopWithFadeByID(id, fadeOutTime);
}
public void StopMusicById(int id)
{
if (DisableAudio) return;
_audioMgrObj.StopMusicById(id);
}
public void StopSoundById(int id)
{
if (DisableAudio) return;
_audioMgrObj.StopSoundByID(id);
}
public void PauseBackgroundMusic()
{
//TODO 暂停背景音乐
_audioMgrObj?.StopAllMusic();
}
/// <summary>
/// 暂停所有音效
/// </summary>
public void PauseAllSound()
{
_audioMgrObj?.PauseAllSound();
}
public void ResumeAllSound()
{
_audioMgrObj?.ResumeAllSound();
}
public void ResumeBackgroundMusic()
{
//TODO 恢复背景音乐
_audioMgrObj?.ResumeAllMusic();
}
/// <summary>
/// 停止语音
/// </summary>
public void StopAllSpeaks()
{
_audioMgrObj?.StopAllSpeaks();
}
public void StopAllMusic()
{
IsPlayingAlbum = false;
IsPlayingBGM = false;
_audioMgrObj?.StopAllMusic();
}
public void StopAll()
{
IsPlayingAlbum = false;
IsPlayingBGM = false;
_audioMgrObj.StopAll();
}
public void GetSpectrumData(AudioCriManager.EPlayType audioType, int id, float[] spectrumsShow, float[] spectrumsData)
{
AudioInst audioInst = _audioMgrObj.GetAudioByID(audioType, id);
if (null == audioInst)
{
for (int i = 0; i < spectrumsShow.Length; ++i)
{
spectrumsShow[i] = 0f;
}
return;
}
audioInst.GetSpectrumData(spectrumsData);
int n = spectrumsData.Length / spectrumsShow.Length;
for (int i = 0; i < spectrumsShow.Length; ++i)
{
float value = 0f;
for (int j = 0; j < n; ++j)
{
value += spectrumsData[i * n + j];
}
value = Mathf.Log10(Mathf.Log(i + 2f, 2f) * value * (i * i + 1) * 9 + 1);
spectrumsShow[i] = value;
}
}
/// <summary>
/// 通过ID和类型获取播放对象
/// </summary>
/// <param name="audioType"></param>
/// <param name="id"></param>
/// <returns></returns>
public AudioInst GetAudioByID(AudioCriManager.EPlayType audioType, int id)
{
if (DisableAudio) return null;
return _audioMgrObj.GetAudioByID(audioType, id);
}
public AudioInst GetStoryAudioInst(AudioBase.AudioType audioType = AudioBase.AudioType.Sound)
{
return _audioMgrObj.GetStoryAudioInst(audioType);
}
public void ReleaseStoryAudios()
{
_audioMgrObj.ReleaseStoryAudios();
}
public void PlayByKey(int audioID, string key, bool isFade = false)
{
_audioMgrObj.PlayByKey(audioID, key, isFade);
}
public void PlayByKey(int audioID, string key, float fadeInTime)
{
_audioMgrObj.PlayByKey(audioID, key, true, fadeInTime);
}
public void PlayByKey(int audioID, string key, float fadeInTime, float targetVolume)
{
_audioMgrObj.PlayByKey(audioID, key, fadeInTime, targetVolume);
}
public int PlayByKey(string key, bool isFade = false, float fadeInTime = 4f)
{
return _audioMgrObj.PlayAudio(key, AudioCriManager.EPlayType.Music, null, true, AudioConstant.DefaultPriority,
isFade, fadeInTime);
}
public void ReleaseAllAudios()
{
_audioMgrObj.ReleaseAllAudios();
}
/// <summary>
/// 通过播放ID获取音频对象
/// </summary>
/// <param name="playID"></param>
/// <returns></returns>
public AudioInst GetSoundByPlayID(long playID)
{
return _audioMgrObj.GetSoundByPlayID(playID);
}
public void InitLimit(int c0, int c1, int c2)
{
AudioMgrObj.InitLimit(c0, c1, c2);
}
public void SetGlobalListenerFollow(bool isActive)
{
if(isActive)
AudioMgrObj.EnterFollowState();
else
AudioMgrObj.ExitFollowState();
}
}