2024-01-19 17:25:06 +08:00
|
|
|
|
using System;
|
|
|
|
|
|
using Cysharp.Threading.Tasks;
|
2023-11-29 15:17:00 +08:00
|
|
|
|
using PhxhSDK;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
using UnityEngine;
|
2025-06-17 17:54:00 +08:00
|
|
|
|
using UnityEngine.Audio;
|
|
|
|
|
|
|
2025-11-12 20:09:48 +08:00
|
|
|
|
public class AudioManager: Singlenton<AudioManager>, IStart, IInitable, IUpdatable
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2025-03-10 13:12:05 +08:00
|
|
|
|
private AudioUnityManager _audioMgrObj = new();
|
2023-11-29 15:17:00 +08:00
|
|
|
|
|
2024-04-28 17:03:37 +08:00
|
|
|
|
public static bool DisableAudio = false;
|
2024-04-28 16:18:27 +08:00
|
|
|
|
|
2024-07-01 17:23:05 +08:00
|
|
|
|
private bool isPlayingAlbum = false;
|
|
|
|
|
|
public bool IsPlayingAlbum
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return isPlayingAlbum;
|
|
|
|
|
|
}
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
isPlayingAlbum = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-10-25 14:37:51 +08:00
|
|
|
|
public bool IsPlayingBGM { get; set; }
|
2024-07-01 17:23:05 +08:00
|
|
|
|
|
2025-03-10 13:12:05 +08:00
|
|
|
|
public AudioUnityManager AudioMgrObj
|
2024-03-26 12:22:47 +08:00
|
|
|
|
{
|
|
|
|
|
|
get { return _audioMgrObj; }
|
|
|
|
|
|
}
|
2025-06-17 17:54:00 +08:00
|
|
|
|
|
2024-01-19 17:25:06 +08:00
|
|
|
|
private void AfterSwitchCamera(bool isRegister = true)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (isRegister)
|
|
|
|
|
|
{
|
|
|
|
|
|
CameraManager.Instance.AfterSwitchMainCamera += _audioMgrObj.AfterSwitchMainCamera;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
CameraManager.Instance.AfterSwitchMainCamera -= _audioMgrObj.AfterSwitchMainCamera;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public void Init()
|
|
|
|
|
|
{
|
2023-11-29 15:17:00 +08:00
|
|
|
|
_audioMgrObj.Init();
|
2024-01-19 17:25:06 +08:00
|
|
|
|
AfterSwitchCamera();
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2023-11-29 15:17:00 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public void Release()
|
|
|
|
|
|
{
|
2023-11-29 15:17:00 +08:00
|
|
|
|
_audioMgrObj.Release();
|
2024-01-19 17:25:06 +08:00
|
|
|
|
AfterSwitchCamera(false);
|
2023-10-19 15:00:19 +08:00
|
|
|
|
}
|
2023-11-29 15:17:00 +08:00
|
|
|
|
|
|
|
|
|
|
public void Start()
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-11-29 15:17:00 +08:00
|
|
|
|
_audioMgrObj.Start();
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2023-11-29 15:17:00 +08:00
|
|
|
|
|
|
|
|
|
|
public void Update(float dt)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-11-29 15:17:00 +08:00
|
|
|
|
_audioMgrObj.Update(dt);
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2025-11-13 18:36:05 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 全局总音量 - 直接访问 AudioVolumeSettings
|
|
|
|
|
|
/// </summary>
|
2023-11-29 15:17:00 +08:00
|
|
|
|
public float GlobalVolume
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2025-11-13 18:36:05 +08:00
|
|
|
|
get { return AudioVolumeSettings.Instance.GlobalVolume; }
|
|
|
|
|
|
set { AudioVolumeSettings.Instance.GlobalVolume = value; }
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-13 18:36:05 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 音乐音量 - 直接访问 AudioVolumeSettings
|
|
|
|
|
|
/// </summary>
|
2023-11-29 15:17:00 +08:00
|
|
|
|
public float GlobalMusicVolume
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2025-11-13 18:36:05 +08:00
|
|
|
|
get { return AudioVolumeSettings.Instance.MusicVolume; }
|
|
|
|
|
|
set { AudioVolumeSettings.Instance.MusicVolume = value; }
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-13 18:36:05 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 音效音量 - 直接访问 AudioVolumeSettings
|
|
|
|
|
|
/// </summary>
|
2023-11-29 15:17:00 +08:00
|
|
|
|
public float GlobalSoundsVolume
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2025-11-13 18:36:05 +08:00
|
|
|
|
get { return AudioVolumeSettings.Instance.SoundVolume; }
|
|
|
|
|
|
set { AudioVolumeSettings.Instance.SoundVolume = value; }
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2023-12-13 15:14:52 +08:00
|
|
|
|
|
2025-11-13 18:36:05 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 语音开关 - 保留在 AudioUnityManager
|
|
|
|
|
|
/// </summary>
|
2023-12-13 15:14:52 +08:00
|
|
|
|
public bool GlobalIsSpeakOpen
|
|
|
|
|
|
{
|
|
|
|
|
|
get { return _audioMgrObj.GlobalIsOpenSpeak; }
|
|
|
|
|
|
set { _audioMgrObj.GlobalIsOpenSpeak = value; }
|
|
|
|
|
|
}
|
2024-04-28 14:24:10 +08:00
|
|
|
|
|
2025-11-13 18:36:05 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 语音音量 - 直接访问 AudioVolumeSettings
|
|
|
|
|
|
/// </summary>
|
2024-04-28 14:24:10 +08:00
|
|
|
|
public float GlobalSpeakVolume
|
|
|
|
|
|
{
|
2025-11-13 18:36:05 +08:00
|
|
|
|
get { return AudioVolumeSettings.Instance.SpeakVolume; }
|
|
|
|
|
|
set { AudioVolumeSettings.Instance.SpeakVolume = value; }
|
2024-04-28 14:24:10 +08:00
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public void SetMusicEnable(bool isEnable)
|
|
|
|
|
|
{
|
|
|
|
|
|
GlobalMusicVolume = isEnable ? 1 : 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void SetSoundEnable(bool isEnable)
|
|
|
|
|
|
{
|
|
|
|
|
|
GlobalSoundsVolume = isEnable ? 1 : 0;
|
|
|
|
|
|
}
|
2024-07-22 19:35:34 +08:00
|
|
|
|
|
2025-03-10 13:12:05 +08:00
|
|
|
|
public async UniTask<float> GetClipLength(string key)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2025-03-10 13:12:05 +08:00
|
|
|
|
return await _audioMgrObj.GetClipLength(key);
|
2023-10-19 15:00:19 +08:00
|
|
|
|
}
|
2024-07-22 19:35:34 +08:00
|
|
|
|
|
|
|
|
|
|
#region 流式播放
|
|
|
|
|
|
|
2025-11-17 19:37:24 +08:00
|
|
|
|
public int PlayAudio(string key, PhxhSDK.EAudioType type = PhxhSDK.EAudioType.Sound,
|
2025-07-22 14:56:44 +08:00
|
|
|
|
GameObject posObj = null, bool loop = false, int priority = AudioConstant.DefaultPriority, bool isFade = false)
|
2023-10-19 15:00:19 +08:00
|
|
|
|
{
|
2025-11-17 19:37:24 +08:00
|
|
|
|
if (DisableAudio)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
if (type == PhxhSDK.EAudioType.Music)
|
2024-10-17 18:38:07 +08:00
|
|
|
|
{
|
|
|
|
|
|
IsPlayingAlbum = false;
|
2024-10-25 14:37:51 +08:00
|
|
|
|
IsPlayingBGM = false;
|
2024-10-17 18:38:07 +08:00
|
|
|
|
}
|
2025-07-22 14:56:44 +08:00
|
|
|
|
return _audioMgrObj.PlayAudio(key, type, posObj, loop, priority, isFade);
|
2023-10-19 15:00:19 +08:00
|
|
|
|
}
|
2024-07-25 17:43:14 +08:00
|
|
|
|
|
2025-11-17 19:37:24 +08:00
|
|
|
|
public int PlayAudio(string key, Vector3 pos, PhxhSDK.EAudioType type = PhxhSDK.EAudioType.Sound, bool loop = false,
|
2025-07-22 14:56:44 +08:00
|
|
|
|
int priority = AudioConstant.DefaultPriority, bool isFade = false)
|
2024-07-25 17:43:14 +08:00
|
|
|
|
{
|
2025-11-17 19:37:24 +08:00
|
|
|
|
if (DisableAudio)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
if (type == PhxhSDK.EAudioType.Music)
|
2024-10-17 18:38:07 +08:00
|
|
|
|
{
|
|
|
|
|
|
IsPlayingAlbum = false;
|
2024-10-25 14:37:51 +08:00
|
|
|
|
IsPlayingBGM = false;
|
2024-10-17 18:38:07 +08:00
|
|
|
|
}
|
2025-07-22 14:56:44 +08:00
|
|
|
|
return _audioMgrObj.PlayAudio(key, type, pos, loop, priority, isFade);
|
2024-07-25 17:43:14 +08:00
|
|
|
|
}
|
2024-07-22 19:35:34 +08:00
|
|
|
|
|
|
|
|
|
|
#endregion
|
2024-03-26 12:22:47 +08:00
|
|
|
|
|
2024-09-10 16:21:12 +08:00
|
|
|
|
public void StopByID(int id)
|
|
|
|
|
|
{
|
2025-04-03 18:56:20 +08:00
|
|
|
|
if (DisableAudio)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
2024-09-10 16:21:12 +08:00
|
|
|
|
_audioMgrObj.StopByID(id);
|
|
|
|
|
|
}
|
2025-03-04 17:31:03 +08:00
|
|
|
|
|
|
|
|
|
|
public void StopWithFadeByID(int id, float fadeOutTime = 1f)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (DisableAudio) return;
|
|
|
|
|
|
_audioMgrObj.StopWithFadeByID(id, fadeOutTime);
|
|
|
|
|
|
}
|
2024-09-10 16:21:12 +08:00
|
|
|
|
|
2025-11-13 16:04:30 +08:00
|
|
|
|
public void StopMusicByID(int id)
|
2024-04-24 12:59:23 +08:00
|
|
|
|
{
|
2024-04-28 16:18:27 +08:00
|
|
|
|
if (DisableAudio) return;
|
2025-11-13 16:04:30 +08:00
|
|
|
|
_audioMgrObj.StopMusicByID(id);
|
2024-04-24 12:59:23 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-13 16:04:30 +08:00
|
|
|
|
public void StopSoundByID(int id)
|
2024-09-10 16:21:12 +08:00
|
|
|
|
{
|
|
|
|
|
|
if (DisableAudio) return;
|
|
|
|
|
|
_audioMgrObj.StopSoundByID(id);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-07-01 17:23:05 +08:00
|
|
|
|
public void PauseBackgroundMusic()
|
|
|
|
|
|
{
|
|
|
|
|
|
_audioMgrObj?.StopAllMusic();
|
|
|
|
|
|
}
|
2025-06-18 14:00:00 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 暂停所有音效
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public void PauseAllSound()
|
|
|
|
|
|
{
|
|
|
|
|
|
_audioMgrObj?.PauseAllSound();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void ResumeAllSound()
|
|
|
|
|
|
{
|
|
|
|
|
|
_audioMgrObj?.ResumeAllSound();
|
|
|
|
|
|
}
|
2024-07-01 17:23:05 +08:00
|
|
|
|
public void ResumeBackgroundMusic()
|
|
|
|
|
|
{
|
|
|
|
|
|
_audioMgrObj?.ResumeAllMusic();
|
|
|
|
|
|
}
|
2024-04-11 19:15:37 +08:00
|
|
|
|
|
2025-06-24 14:58:32 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 停止语音
|
|
|
|
|
|
/// </summary>
|
2024-10-08 16:59:48 +08:00
|
|
|
|
public void StopAllSpeaks()
|
|
|
|
|
|
{
|
|
|
|
|
|
_audioMgrObj?.StopAllSpeaks();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-12 17:27:24 +08:00
|
|
|
|
public void StopAllMusic()
|
|
|
|
|
|
{
|
2024-10-17 16:24:24 +08:00
|
|
|
|
IsPlayingAlbum = false;
|
2024-10-25 14:37:51 +08:00
|
|
|
|
IsPlayingBGM = false;
|
2024-10-17 16:24:24 +08:00
|
|
|
|
_audioMgrObj?.StopAllMusic();
|
2024-10-12 17:27:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-04-11 19:15:37 +08:00
|
|
|
|
public void StopAll()
|
|
|
|
|
|
{
|
2024-10-17 16:24:24 +08:00
|
|
|
|
IsPlayingAlbum = false;
|
2024-10-25 14:37:51 +08:00
|
|
|
|
IsPlayingBGM = false;
|
2024-04-11 19:15:37 +08:00
|
|
|
|
_audioMgrObj.StopAll();
|
|
|
|
|
|
}
|
2024-04-23 19:42:31 +08:00
|
|
|
|
|
2025-11-18 13:54:05 +08:00
|
|
|
|
public void GetSpectrumData(int id, float[] spectrumsShow, float[] spectrumsData)
|
2025-04-16 17:58:35 +08:00
|
|
|
|
{
|
2025-11-18 13:54:05 +08:00
|
|
|
|
AudioPlayer audioInst = _audioMgrObj.GetAudioByID(id);
|
2025-04-16 17:58:35 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-24 14:58:32 +08:00
|
|
|
|
/// <summary>
|
2025-11-18 13:54:05 +08:00
|
|
|
|
/// 通过ID获取播放对象
|
2025-06-24 14:58:32 +08:00
|
|
|
|
/// </summary>
|
2025-11-18 13:54:05 +08:00
|
|
|
|
public AudioPlayer GetAudioByID(int id)
|
2024-04-23 19:42:31 +08:00
|
|
|
|
{
|
2024-04-28 16:18:27 +08:00
|
|
|
|
if (DisableAudio) return null;
|
2025-11-18 13:54:05 +08:00
|
|
|
|
return _audioMgrObj.GetAudioByID(id);
|
2024-04-23 19:42:31 +08:00
|
|
|
|
}
|
2024-08-01 14:03:20 +08:00
|
|
|
|
|
2025-11-17 19:37:24 +08:00
|
|
|
|
public AudioPlayer GetStoryAudioInst(PhxhSDK.EAudioType eAudioType = PhxhSDK.EAudioType.Sound)
|
2024-08-01 14:03:20 +08:00
|
|
|
|
{
|
2025-11-17 19:37:24 +08:00
|
|
|
|
return _audioMgrObj.GetStoryAudioInst(eAudioType);
|
2024-08-01 14:03:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void ReleaseStoryAudios()
|
|
|
|
|
|
{
|
|
|
|
|
|
_audioMgrObj.ReleaseStoryAudios();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-12 19:15:06 +08:00
|
|
|
|
public void PlayByKey(int audioID, string key, bool isFade = false)
|
2024-08-01 14:03:20 +08:00
|
|
|
|
{
|
2025-11-12 19:15:06 +08:00
|
|
|
|
_audioMgrObj.PlayByKey(audioID, key, isFade);
|
2025-03-04 17:31:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-12 19:15:06 +08:00
|
|
|
|
public void PlayByKey(int audioID, string key, float fadeInTime)
|
2025-03-04 17:31:03 +08:00
|
|
|
|
{
|
2025-11-12 19:15:06 +08:00
|
|
|
|
_audioMgrObj.PlayByKey(audioID, key, true, fadeInTime);
|
2024-08-01 14:03:20 +08:00
|
|
|
|
}
|
2025-11-12 19:15:06 +08:00
|
|
|
|
|
|
|
|
|
|
public void PlayByKey(int audioID, string key, float fadeInTime, float targetVolume)
|
2025-03-05 13:40:25 +08:00
|
|
|
|
{
|
2025-11-12 19:15:06 +08:00
|
|
|
|
_audioMgrObj.PlayByKey(audioID, key, fadeInTime, targetVolume);
|
2025-03-05 13:40:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-12 19:15:06 +08:00
|
|
|
|
public int PlayByKey(string key, bool isFade = false, float fadeInTime = 4f)
|
2024-09-11 19:59:36 +08:00
|
|
|
|
{
|
2025-11-17 19:37:24 +08:00
|
|
|
|
return _audioMgrObj.PlayAudio(key, PhxhSDK.EAudioType.Music, null, true, AudioConstant.DefaultPriority,
|
2025-07-22 14:56:44 +08:00
|
|
|
|
isFade, fadeInTime);
|
2024-09-11 19:59:36 +08:00
|
|
|
|
}
|
2024-08-23 19:53:32 +08:00
|
|
|
|
public void ReleaseAllAudios()
|
|
|
|
|
|
{
|
|
|
|
|
|
_audioMgrObj.ReleaseAllAudios();
|
|
|
|
|
|
}
|
2024-09-10 16:21:12 +08:00
|
|
|
|
|
2025-06-24 14:58:32 +08:00
|
|
|
|
/// <summary>
|
2025-11-14 20:02:22 +08:00
|
|
|
|
/// 通过音频ID获取音频对象
|
2025-06-24 14:58:32 +08:00
|
|
|
|
/// </summary>
|
2025-11-14 20:02:22 +08:00
|
|
|
|
/// <param name="audioID"></param>
|
2025-06-24 14:58:32 +08:00
|
|
|
|
/// <returns></returns>
|
2025-11-14 20:02:22 +08:00
|
|
|
|
public AudioPlayer GetSoundByAudioID(int audioID)
|
2025-06-24 14:58:32 +08:00
|
|
|
|
{
|
2025-11-14 20:02:22 +08:00
|
|
|
|
return _audioMgrObj.GetSoundByAudioID(audioID);
|
2025-06-24 14:58:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-16 16:03:13 +08:00
|
|
|
|
public void InitLimit(int c0, int c1, int c2)
|
|
|
|
|
|
{
|
|
|
|
|
|
AudioMgrObj.InitLimit(c0, c1, c2);
|
|
|
|
|
|
}
|
2025-04-02 13:08:43 +08:00
|
|
|
|
|
2025-04-02 15:00:32 +08:00
|
|
|
|
public void SetGlobalListenerFollow(bool isActive)
|
2025-04-02 13:08:43 +08:00
|
|
|
|
{
|
2025-04-02 15:00:32 +08:00
|
|
|
|
if(isActive)
|
|
|
|
|
|
AudioMgrObj.EnterFollowState();
|
|
|
|
|
|
else
|
|
|
|
|
|
AudioMgrObj.ExitFollowState();
|
2025-04-02 13:08:43 +08:00
|
|
|
|
}
|
2023-11-29 15:17:00 +08:00
|
|
|
|
}
|