2025-03-10 13:12:05 +08:00
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
//using CriWare;
|
|
|
|
|
|
using Cysharp.Threading.Tasks;
|
|
|
|
|
|
using Framework;
|
|
|
|
|
|
using PhxhSDK;
|
|
|
|
|
|
using UnityEngine;
|
2025-06-17 17:54:00 +08:00
|
|
|
|
using UnityEngine.Audio;
|
2025-04-16 12:24:10 +08:00
|
|
|
|
using Constants = Framework.Constants;
|
2025-03-10 13:12:05 +08:00
|
|
|
|
using Object = UnityEngine.Object;
|
|
|
|
|
|
using EPlayType = AudioCriManager.EPlayType;
|
|
|
|
|
|
|
|
|
|
|
|
public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable, IUpdatable, IAudioPlay
|
|
|
|
|
|
{
|
|
|
|
|
|
public GameObject initGameObject;
|
|
|
|
|
|
public GameObject AudioRoot;
|
|
|
|
|
|
public GameObject CriAtomRoot;
|
|
|
|
|
|
//public CriAtom CriAtom;
|
|
|
|
|
|
public ClipType curClipType;
|
|
|
|
|
|
|
|
|
|
|
|
private AudioInst _bgmAudioCri;
|
|
|
|
|
|
// public CriAtomListener Listener;
|
|
|
|
|
|
// private Dictionary<string, CriAtomEx.CueInfo[]> _cacheCueInfoArrays = new();
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 对象池数量限制
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public int MusicPoolLimit = 1;
|
|
|
|
|
|
public int SoundPoolLimit = 100;
|
|
|
|
|
|
public int SpeakPoolLimit = 1;
|
|
|
|
|
|
|
|
|
|
|
|
// public enum EPlayType
|
|
|
|
|
|
// {
|
|
|
|
|
|
// Music,
|
|
|
|
|
|
// Sound,
|
|
|
|
|
|
// Speak
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
private GameObject _criError;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 播放音频对象池
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private Dictionary<int, AudioInst> _soundAudioDic;
|
|
|
|
|
|
private Dictionary<int, AudioInst> _soundAudioLoopDic;
|
|
|
|
|
|
private Dictionary<int, AudioInst> _musicAudioDic;
|
|
|
|
|
|
private Dictionary<int, AudioInst> _musicAudioLoopDic;
|
|
|
|
|
|
private Dictionary<int, AudioInst> _allAudioDic;
|
|
|
|
|
|
|
|
|
|
|
|
private List<GameObject> _soundAudioObj;
|
|
|
|
|
|
private List<GameObject> _soundAudioLoopObj;
|
|
|
|
|
|
private List<GameObject> _musicAudioObj;
|
|
|
|
|
|
private List<GameObject> _musicAudioLoopObj;
|
|
|
|
|
|
|
|
|
|
|
|
public enum PlayType
|
|
|
|
|
|
{
|
|
|
|
|
|
Music,
|
|
|
|
|
|
Sound,
|
|
|
|
|
|
Speak
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private Dictionary<PlayType, List<int>> _playingLDic;
|
|
|
|
|
|
|
|
|
|
|
|
private List<AudioInst> _soundAudioQue;
|
|
|
|
|
|
|
|
|
|
|
|
private Dictionary<int, AudioInst> _storyAudioDic;
|
|
|
|
|
|
|
|
|
|
|
|
private const int SOUND_MAX_NUM = 20;
|
|
|
|
|
|
private const int MUSIC_MAX_NUM = 2;
|
2025-04-02 13:08:43 +08:00
|
|
|
|
|
2025-04-02 15:00:32 +08:00
|
|
|
|
public AudioListener GlobalListener; //全局监听
|
|
|
|
|
|
private bool _isFollowCamera = false; //是否跟随相机
|
2025-06-17 17:54:00 +08:00
|
|
|
|
|
|
|
|
|
|
public AudioMixer masterMixer;
|
|
|
|
|
|
|
2025-03-10 13:12:05 +08:00
|
|
|
|
|
|
|
|
|
|
#region Property
|
|
|
|
|
|
|
|
|
|
|
|
private float _vol = 1f;
|
|
|
|
|
|
|
|
|
|
|
|
public float GlobalSoundsVolume
|
|
|
|
|
|
{
|
|
|
|
|
|
get => AudioUnity.GlobalSoundVolume;
|
|
|
|
|
|
set => AudioUnity.GlobalSoundVolume = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
public float GlobalSpeakVolume{
|
|
|
|
|
|
get => AudioUnity.GlobalSpeakVolume;
|
|
|
|
|
|
set => AudioUnity.GlobalSpeakVolume = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public float GlobalMusicVolume {
|
|
|
|
|
|
get => AudioUnity.GlobalMusicVolume;
|
|
|
|
|
|
set => AudioUnity.GlobalMusicVolume = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public float GlobalVolume
|
|
|
|
|
|
{
|
|
|
|
|
|
get => AudioUnity.GlobalVolume;
|
|
|
|
|
|
set => AudioUnity.GlobalVolume = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool GlobalIsOpenSpeak;
|
|
|
|
|
|
|
|
|
|
|
|
public AudioInst BgmAudioCri
|
|
|
|
|
|
{
|
|
|
|
|
|
get { return _bgmAudioCri; }
|
|
|
|
|
|
set { _bgmAudioCri = value; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//public CriAtomExOutputAnalyzer analyzer=null;
|
|
|
|
|
|
public bool IsAnalyzer = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region Analyze
|
|
|
|
|
|
|
|
|
|
|
|
//在播放之前注册
|
|
|
|
|
|
// public CriAtomExOutputAnalyzer RegisterAnalyzer()//CriAtomExOutputAnalyzer s
|
|
|
|
|
|
// {
|
|
|
|
|
|
// IsAnalyzer = true;
|
|
|
|
|
|
// if (analyzer == null)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// analyzer = new(NewAnalyzerConfig());
|
|
|
|
|
|
// }
|
|
|
|
|
|
// return analyzer;
|
|
|
|
|
|
// //analyzer = s;
|
|
|
|
|
|
// }
|
|
|
|
|
|
//
|
|
|
|
|
|
// public void UnregisterAnalyzer()//CriAtomExOutputAnalyzer s
|
|
|
|
|
|
// {
|
|
|
|
|
|
// //s.DetachExPlayer();
|
|
|
|
|
|
// IsAnalyzer = false;
|
|
|
|
|
|
// //analyzer = null;
|
|
|
|
|
|
// }
|
|
|
|
|
|
//
|
|
|
|
|
|
// /// <summary>
|
|
|
|
|
|
// /// 获取音频输出分析器配置
|
|
|
|
|
|
// /// </summary>
|
|
|
|
|
|
// /// <returns></returns>
|
|
|
|
|
|
// private CriAtomExOutputAnalyzer.Config NewAnalyzerConfig()
|
|
|
|
|
|
// {
|
|
|
|
|
|
// CriAtomExOutputAnalyzer.Config config = new()
|
|
|
|
|
|
// {
|
|
|
|
|
|
// enableSpectrumAnalyzer = true, // 开启频谱分析
|
|
|
|
|
|
// numSpectrumAnalyzerBands = 16, // 频谱分析数量SPECTRUM_SAMPLES_NUMBER
|
|
|
|
|
|
// };
|
|
|
|
|
|
//
|
|
|
|
|
|
// return config;
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region Framework
|
|
|
|
|
|
|
|
|
|
|
|
public void Start()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!AudioRoot)
|
|
|
|
|
|
{
|
|
|
|
|
|
curClipType = ClipType.AudioClip;
|
|
|
|
|
|
|
|
|
|
|
|
AudioRoot = new GameObject();
|
|
|
|
|
|
AudioRoot.name = "Audio(Singleton)";
|
|
|
|
|
|
Object.DontDestroyOnLoad(AudioRoot);
|
2025-04-02 13:08:43 +08:00
|
|
|
|
GlobalListener = AudioRoot.AddComponent<AudioListener>();
|
2025-04-02 15:00:32 +08:00
|
|
|
|
_InitListenerPos();
|
2025-03-10 13:12:05 +08:00
|
|
|
|
|
2025-06-17 17:54:00 +08:00
|
|
|
|
InitMixer();
|
2025-03-10 13:12:05 +08:00
|
|
|
|
// if (curClipType == ClipType.CriwareClip)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// _criError = new GameObject();
|
|
|
|
|
|
// _criError.name = "CriwareError";
|
|
|
|
|
|
// _criError.AddComponent<CriWareErrorHandler>();
|
|
|
|
|
|
// Object.DontDestroyOnLoad(_criError);
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
// var initialize = GameObject.Find("CriWareLibraryInitializer");
|
|
|
|
|
|
// Object.DontDestroyOnLoad(initialize);
|
|
|
|
|
|
// CriAtomRoot = GameObject.Find("CriAtom");
|
|
|
|
|
|
// CriAtom = CriAtomRoot.GetComponent<CriAtom>();
|
|
|
|
|
|
//Object.DontDestroyOnLoad(CriAtomRoot);
|
|
|
|
|
|
}
|
|
|
|
|
|
// CriAtomRoot = new GameObject()
|
|
|
|
|
|
// {
|
|
|
|
|
|
// name = "CriAtom"
|
|
|
|
|
|
// };
|
|
|
|
|
|
// CriAtom = CriAtomRoot.AddComponent<CriAtom>();
|
|
|
|
|
|
// CriAtom.AddCueSheet()
|
|
|
|
|
|
|
|
|
|
|
|
// for (int i = 0; i < SOUND_MAX_NUM; i++)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// var go = new GameObject
|
|
|
|
|
|
// {
|
|
|
|
|
|
// name = "Sound" + (i+1)
|
|
|
|
|
|
// };
|
|
|
|
|
|
// go.transform.SetParent(AudioRoot.transform);
|
|
|
|
|
|
// }
|
|
|
|
|
|
//
|
|
|
|
|
|
// for (int i = 0; i < MUSIC_MAX_NUM; i++)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// var go = new GameObject
|
|
|
|
|
|
// {
|
|
|
|
|
|
// name = "Music" + (i+1)
|
|
|
|
|
|
// };
|
|
|
|
|
|
// go.transform.SetParent(AudioRoot.transform);
|
|
|
|
|
|
// }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void Init()
|
|
|
|
|
|
{
|
|
|
|
|
|
_soundAudioDic = new Dictionary<int, AudioInst>();
|
|
|
|
|
|
_soundAudioLoopDic = new Dictionary<int, AudioInst>();
|
|
|
|
|
|
_musicAudioDic = new Dictionary<int, AudioInst>();
|
|
|
|
|
|
_musicAudioLoopDic = new Dictionary<int, AudioInst>();
|
|
|
|
|
|
|
|
|
|
|
|
_allAudioDic = new Dictionary<int, AudioInst>();
|
|
|
|
|
|
_soundAudioLoopObj = new();
|
|
|
|
|
|
_musicAudioLoopObj = new();
|
|
|
|
|
|
_soundAudioObj = new();
|
|
|
|
|
|
_musicAudioObj = new();
|
|
|
|
|
|
_playingLDic = new ();
|
|
|
|
|
|
_playingLDic.Add(PlayType.Music, new List<int>());
|
|
|
|
|
|
_playingLDic.Add(PlayType.Sound, new List<int>());
|
|
|
|
|
|
_playingLDic.Add(PlayType.Speak, new List<int>());
|
|
|
|
|
|
|
|
|
|
|
|
_storyAudioDic = new();
|
2025-04-16 12:24:10 +08:00
|
|
|
|
|
|
|
|
|
|
EventManager.Instance.Register(EventManager.EventName.Audio_ErrorAudioPlay, _OnErrorAudioPlay);
|
2025-03-10 13:12:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void Release()
|
|
|
|
|
|
{
|
2025-04-16 12:24:10 +08:00
|
|
|
|
EventManager.Instance.Unregister(EventManager.EventName.Audio_ErrorAudioPlay, _OnErrorAudioPlay);
|
2025-03-10 13:12:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void Update(float dt)
|
|
|
|
|
|
{
|
2025-04-08 16:50:58 +08:00
|
|
|
|
_SetListenerPos();
|
2025-03-10 13:12:05 +08:00
|
|
|
|
foreach (var kv in _musicAudioDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
if (!audio.IsStopped)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.Update(dt);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var kv in _musicAudioLoopDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
if (!audio.IsStopped)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.Update(dt);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var kv in _soundAudioDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
if (!audio.IsStopped)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.Update(dt);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var kv in _soundAudioLoopDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
if (!audio.IsStopped)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.Update(dt);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var kv in _storyAudioDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
if (!audio.IsStopped)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.Update(dt);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region LoadAsset
|
|
|
|
|
|
|
2025-06-17 17:54:00 +08:00
|
|
|
|
private async void InitMixer()
|
|
|
|
|
|
{
|
|
|
|
|
|
masterMixer =
|
|
|
|
|
|
await AssetManager.Instance.LoadAssetAsync<AudioMixer>("Assets/Audio/AudioMixers/MasterMixer.mixer");
|
|
|
|
|
|
masterMixer.SetFloat("MasterCompressorThreshold", -10f);
|
|
|
|
|
|
}
|
2025-04-14 14:24:53 +08:00
|
|
|
|
private string GetFullPath(string key, bool isI18N = false)
|
2025-03-10 13:12:05 +08:00
|
|
|
|
{
|
2025-03-13 14:58:18 +08:00
|
|
|
|
var cfg = TableManager.Instance.Tables.AudioSourceConfig.GetOrDefault(key);
|
|
|
|
|
|
if (cfg == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError($"音频Key:{key}找不到!");
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
2025-04-14 14:24:53 +08:00
|
|
|
|
|
|
|
|
|
|
if (isI18N)
|
|
|
|
|
|
{
|
|
|
|
|
|
var path = cfg.Path;
|
2025-04-24 19:31:27 +08:00
|
|
|
|
if (path.Contains(LanguageManager.I18N))
|
2025-04-14 14:24:53 +08:00
|
|
|
|
{
|
|
|
|
|
|
var eLanguage = LanguageManager.Instance.GetCurrentLanguage();
|
|
|
|
|
|
var replacePath = LanguageManager.PathDic[eLanguage];
|
2025-04-24 19:31:27 +08:00
|
|
|
|
path = path.Replace(LanguageManager.I18N, replacePath);
|
2025-04-14 14:24:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
return path;
|
|
|
|
|
|
}
|
2025-03-13 14:58:18 +08:00
|
|
|
|
return cfg.Path;
|
2025-03-10 13:12:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//优化SplitGC
|
|
|
|
|
|
private string _GetCriPath(string name)
|
|
|
|
|
|
{
|
|
|
|
|
|
var firstChar = name[0];
|
|
|
|
|
|
if (!string.IsNullOrEmpty(name))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (firstChar == 'b')
|
|
|
|
|
|
{
|
|
|
|
|
|
return "CueSheet_bgm";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (firstChar == 'V')
|
|
|
|
|
|
{
|
|
|
|
|
|
return "CueSheet_Voice";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (firstChar == 'S')
|
|
|
|
|
|
{
|
|
|
|
|
|
return "CueSheet_Sound";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (firstChar == 'e')
|
|
|
|
|
|
{
|
|
|
|
|
|
return "CueSheet_ev";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (firstChar == 'u')
|
|
|
|
|
|
{
|
|
|
|
|
|
return "CueSheet_ui";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private string _GetAcbPath(string name)
|
|
|
|
|
|
{
|
|
|
|
|
|
var path = _GetCriPath(name);
|
|
|
|
|
|
if (string.IsNullOrEmpty(path))
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError($"获取不到对应的ACB文件,key: {name}");
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return path + ".acb";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private string _GetAwbPath(string name)
|
|
|
|
|
|
{
|
|
|
|
|
|
var path = _GetCriPath(name);
|
|
|
|
|
|
if (string.IsNullOrEmpty(path))
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError($"获取不到对应的AWB文件,key: {name}");
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return path + ".awb";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private string _GetAcfPath(string name)
|
|
|
|
|
|
{
|
|
|
|
|
|
var path = _GetCriPath(name);
|
|
|
|
|
|
if (path == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError($"获取不到对应的ACF文件,key: {name}");
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return path + ".acf";
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region AudioObj
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取可用的Audio
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="audioType"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
private AudioInst _GetUsableAudio(AudioBase.AudioType audioType, bool isLoop, bool isSpeak = false)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
var limit = _CheckIsAudioLimited(audioType, isSpeak);
|
|
|
|
|
|
if (limit)
|
|
|
|
|
|
{
|
|
|
|
|
|
return _GetOldAudio(audioType, isLoop, isSpeak);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var freeAudio = _GetFreeAudio(audioType, isLoop);
|
|
|
|
|
|
return freeAudio ?? _CreateNewAudio(audioType, isLoop);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError($"AudioManger, GetUsableAudio Fail.{e}");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private AudioInst _GetOldAudio(AudioBase.AudioType audioType, bool isLoop, bool isSpeak)
|
|
|
|
|
|
{
|
|
|
|
|
|
var playingList = _playingLDic[GetPlayType(audioType, isSpeak)];
|
|
|
|
|
|
if (playingList.Count > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = GetAudioByID(playingList[0]);
|
|
|
|
|
|
return audio;
|
|
|
|
|
|
}
|
|
|
|
|
|
return _CreateNewAudio(audioType, isLoop);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private int _GetLimit(AudioBase.AudioType audioType, bool isSpeak)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (isSpeak)
|
|
|
|
|
|
{
|
|
|
|
|
|
return SpeakPoolLimit;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (audioType == AudioBase.AudioType.Music)
|
|
|
|
|
|
{
|
|
|
|
|
|
return MusicPoolLimit;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (audioType == AudioBase.AudioType.Sound)
|
|
|
|
|
|
{
|
|
|
|
|
|
return SoundPoolLimit;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private PlayType GetPlayType(AudioBase.AudioType audioType, bool isSpeak)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (isSpeak)
|
|
|
|
|
|
return PlayType.Speak;
|
|
|
|
|
|
if (audioType == AudioBase.AudioType.Music)
|
|
|
|
|
|
return PlayType.Music;
|
|
|
|
|
|
return PlayType.Sound;
|
|
|
|
|
|
}
|
|
|
|
|
|
private bool _CheckIsAudioLimited(AudioBase.AudioType audioType, bool isSpeak)
|
|
|
|
|
|
{
|
|
|
|
|
|
var limit = _GetLimit(audioType, isSpeak);
|
|
|
|
|
|
var playingList = _playingLDic[GetPlayType(audioType, isSpeak)];
|
|
|
|
|
|
if (playingList.Count >= limit)
|
|
|
|
|
|
{
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private Dictionary<int, AudioInst> _GetAudioDic(AudioBase.AudioType audioType, bool isLoop)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (audioType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case AudioBase.AudioType.Music:
|
|
|
|
|
|
return isLoop? _musicAudioLoopDic : _musicAudioDic;
|
|
|
|
|
|
case AudioBase.AudioType.Sound:
|
|
|
|
|
|
return isLoop? _soundAudioLoopDic : _soundAudioDic;
|
|
|
|
|
|
default:
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("获取AudioDic出错!!!传入AudioType有误!");
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private AudioInst _GetFreeAudio(AudioBase.AudioType audioType, bool isLoop)
|
|
|
|
|
|
{
|
|
|
|
|
|
var dic = _GetAudioDic(audioType, isLoop);
|
|
|
|
|
|
if (dic != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var kv in dic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
if (audio.IsStopped)
|
|
|
|
|
|
{
|
|
|
|
|
|
return audio;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-30 13:40:27 +08:00
|
|
|
|
private AudioInst _CreateStoryAudio(GameObject posGo = null, AudioBase.AudioType audioType = AudioBase.AudioType.Sound)
|
2025-03-10 13:12:05 +08:00
|
|
|
|
{
|
|
|
|
|
|
var rootGo = new GameObject()
|
|
|
|
|
|
{
|
|
|
|
|
|
name = "AudioStory"
|
|
|
|
|
|
};
|
|
|
|
|
|
rootGo.transform.SetParent(AudioRoot.transform);
|
2025-05-30 13:40:27 +08:00
|
|
|
|
var audio = new AudioInst(audioType, rootGo, null);
|
2025-03-10 13:12:05 +08:00
|
|
|
|
rootGo.name += audio.audioID;
|
|
|
|
|
|
_storyAudioDic.TryAdd(audio.audioID, audio);
|
|
|
|
|
|
_allAudioDic.Add(audio.audioID, audio);
|
|
|
|
|
|
return audio;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private AudioInst _CreateNewAudio(AudioBase.AudioType audioType, bool isLoop)
|
|
|
|
|
|
{
|
|
|
|
|
|
var rootGo = new GameObject()
|
|
|
|
|
|
{
|
|
|
|
|
|
name = "Audio"
|
|
|
|
|
|
};
|
|
|
|
|
|
rootGo.transform.SetParent(AudioRoot.transform);
|
|
|
|
|
|
var audio = new AudioInst(audioType, rootGo, null);
|
|
|
|
|
|
|
|
|
|
|
|
if (audioType == AudioBase.AudioType.Music)
|
|
|
|
|
|
{
|
|
|
|
|
|
rootGo.name = "music";
|
|
|
|
|
|
rootGo.name += audio.audioID;
|
|
|
|
|
|
if (isLoop)
|
|
|
|
|
|
{
|
|
|
|
|
|
rootGo.name += "Loop";
|
|
|
|
|
|
_musicAudioLoopDic.TryAdd(audio.audioID, audio);
|
|
|
|
|
|
_musicAudioLoopObj.Add(rootGo);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
_musicAudioDic.TryAdd(audio.audioID, audio);
|
|
|
|
|
|
_musicAudioObj.Add(rootGo);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// if (IsAnalyzer)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// rootGo.GetComponent<CriAtomSource>().AttachToAnalyzer(analyzer);
|
|
|
|
|
|
// }
|
|
|
|
|
|
}
|
|
|
|
|
|
if (audioType == AudioBase.AudioType.Sound)
|
|
|
|
|
|
{
|
|
|
|
|
|
rootGo.name = "Sound";
|
|
|
|
|
|
rootGo.name += audio.audioID;
|
|
|
|
|
|
if (isLoop)
|
|
|
|
|
|
{
|
|
|
|
|
|
rootGo.name += "Loop";
|
|
|
|
|
|
_soundAudioLoopDic.TryAdd(audio.audioID, audio);
|
|
|
|
|
|
_soundAudioLoopObj.Add(rootGo);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
_soundAudioDic.TryAdd(audio.audioID, audio);
|
|
|
|
|
|
_soundAudioObj.Add(rootGo);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
_allAudioDic.Add(audio.audioID, audio);
|
|
|
|
|
|
|
|
|
|
|
|
return audio;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region Play
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 调用接口,传obj
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="key"></param>
|
|
|
|
|
|
/// <param name="type"></param>
|
|
|
|
|
|
/// <param name="posObj"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
private int _PlayAudio(string key, AudioCriManager.EPlayType type, GameObject posObj = null, bool isLoop = false,
|
|
|
|
|
|
bool isFade = false, float fadeTime = 0f)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case AudioCriManager.EPlayType.Sound:
|
|
|
|
|
|
if (AudioUnity.GlobalVolume <= 0 || AudioUnity.GlobalSoundVolume <= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case AudioCriManager.EPlayType.Speak:
|
|
|
|
|
|
if (AudioUnity.GlobalVolume <= 0 || AudioUnity.GlobalSpeakVolume <= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (string.IsNullOrEmpty(key))
|
|
|
|
|
|
{
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//策略2 超过限制不播
|
|
|
|
|
|
// var audioType = AudioBase.AudioType.Music;
|
|
|
|
|
|
// bool isSpeak = false;
|
|
|
|
|
|
// if (type == EPlayType.Sound)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// audioType = AudioBase.AudioType.Sound;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// if (type == EPlayType.Speak)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// audioType = AudioBase.AudioType.Sound;
|
|
|
|
|
|
// isSpeak = true;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// if (_CheckIsAudioLimited(audioType, isSpeak))
|
|
|
|
|
|
// {
|
|
|
|
|
|
// return -1;
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
string path = _GetCriPath(key);
|
|
|
|
|
|
|
|
|
|
|
|
switch (type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case AudioCriManager.EPlayType.Music:
|
|
|
|
|
|
{
|
|
|
|
|
|
return _PlayMusic(key, posObj, isLoop, isFade, fadeTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
case AudioCriManager.EPlayType.Sound:
|
|
|
|
|
|
{
|
|
|
|
|
|
return _PlaySound(key, posObj, isLoop, isFade, fadeTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
case AudioCriManager.EPlayType.Speak:
|
|
|
|
|
|
{
|
|
|
|
|
|
return _PlaySpeakSound(key, posObj, isFade, fadeTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
default: break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 调用接口,传位置
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="key"></param>
|
|
|
|
|
|
/// <param name="type"></param>
|
|
|
|
|
|
/// <param name="pos"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
private int _PlayAudio(string key, AudioCriManager.EPlayType type, Vector3 pos, bool loop = false,
|
|
|
|
|
|
bool isFade = false, float fadeTime = 0f)
|
|
|
|
|
|
{
|
|
|
|
|
|
//策略2 超过限制不播
|
|
|
|
|
|
// var audioType = AudioBase.AudioType.Music;
|
|
|
|
|
|
// bool isSpeak = false;
|
|
|
|
|
|
// if (type == EPlayType.Sound)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// audioType = AudioBase.AudioType.Sound;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// if (type == EPlayType.Speak)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// audioType = AudioBase.AudioType.Sound;
|
|
|
|
|
|
// isSpeak = true;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// if (_CheckIsAudioLimited(audioType, isSpeak))
|
|
|
|
|
|
// {
|
|
|
|
|
|
// return -1;
|
|
|
|
|
|
// }
|
|
|
|
|
|
switch (type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case EPlayType.Sound:
|
|
|
|
|
|
if (AudioUnity.GlobalVolume <= 0 || AudioUnity.GlobalSoundVolume <= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case EPlayType.Speak:
|
|
|
|
|
|
if (AudioUnity.GlobalVolume <= 0 || AudioUnity.GlobalSpeakVolume <= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string path = _GetCriPath(key);
|
|
|
|
|
|
|
|
|
|
|
|
switch (type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case EPlayType.Music:
|
|
|
|
|
|
{
|
|
|
|
|
|
return _PlayMusic(key, pos, loop, isFade, fadeTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
case EPlayType.Sound:
|
|
|
|
|
|
{
|
|
|
|
|
|
return _PlaySound(key, pos, loop, isFade, fadeTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
case EPlayType.Speak:
|
|
|
|
|
|
{
|
|
|
|
|
|
return _PlaySpeakSound(key, pos, isFade, fadeTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
default: break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private int _PlayMusic(string key, GameObject posObj = null, bool isLoop = true, bool isFade = false, float fadeTime = 0f, float volume = 1f)
|
|
|
|
|
|
{
|
|
|
|
|
|
// if (GlobalMusicVolume < 0.01f)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// return -1;
|
|
|
|
|
|
// }
|
|
|
|
|
|
var path = GetFullPath(key);
|
|
|
|
|
|
if (!isFade)
|
|
|
|
|
|
{
|
|
|
|
|
|
// if (_bgmAudio != null)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// _bgmAudio.Stop();
|
|
|
|
|
|
// }
|
|
|
|
|
|
AudioInfo audioInfo = new AudioInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
persist = true,
|
|
|
|
|
|
volume = 1,
|
|
|
|
|
|
fadeInValue = 0.3f,
|
|
|
|
|
|
fadeOutValue = 0.3f,
|
|
|
|
|
|
};
|
|
|
|
|
|
var audio = _GetUsableAudio(AudioBase.AudioType.Music, isLoop);
|
|
|
|
|
|
|
|
|
|
|
|
//错误打印,保护
|
|
|
|
|
|
if (audio == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError($"AudioManager, PlayMusic, Cant GetUsableAudio key:{key}");
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
audio.SetPosObj(posObj);
|
|
|
|
|
|
audio.SetIsSpeak(false);
|
|
|
|
|
|
audio.SetVolume(volume);
|
|
|
|
|
|
audio.SetIsLoop(isLoop);
|
|
|
|
|
|
// if (_bgmAudio != null && _bgmAudio != audio)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// _bgmAudio.Stop();
|
|
|
|
|
|
// }
|
|
|
|
|
|
//audio.Stop();
|
|
|
|
|
|
audio.Play(path);
|
|
|
|
|
|
audio.SetIsLoop(isLoop);
|
|
|
|
|
|
//_bgmAudio = audio;
|
|
|
|
|
|
return audio.audioID;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
AudioInfo audioInfo = new AudioInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
persist = true,
|
|
|
|
|
|
volume = 1,
|
|
|
|
|
|
fadeInValue = 0.3f,
|
|
|
|
|
|
fadeOutValue = 0.3f,
|
|
|
|
|
|
};
|
|
|
|
|
|
var audio = _GetUsableAudio(AudioBase.AudioType.Music, isLoop);
|
|
|
|
|
|
audio.SetPosObj(posObj);
|
|
|
|
|
|
audio.SetIsSpeak(false);
|
|
|
|
|
|
// if (_bgmAudio != null && _bgmAudio != audio)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// _bgmAudio.Stop();
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
//audio.SetIsFadeIn(true);
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
audio.SetVolume(0);
|
|
|
|
|
|
audio.PlayWithFade(path, fadeTime);
|
|
|
|
|
|
audio.SetIsLoop(isLoop);
|
|
|
|
|
|
//_bgmAudio = audio;
|
|
|
|
|
|
return audio.audioID;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private int _PlayMusic(string key, Vector3 pos, bool isLoop, bool isFade = false, float fadeTime = 0f, float volume = 1f)
|
|
|
|
|
|
{
|
|
|
|
|
|
// if (GlobalMusicVolume < 0.01f)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// return -1;
|
|
|
|
|
|
// }
|
|
|
|
|
|
AudioInfo audioInfo = new AudioInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
persist = true,
|
|
|
|
|
|
volume = 1,
|
|
|
|
|
|
fadeInValue = 0.3f,
|
|
|
|
|
|
fadeOutValue = 0.3f,
|
|
|
|
|
|
};
|
|
|
|
|
|
var audio = _GetUsableAudio(AudioBase.AudioType.Music, isLoop);
|
|
|
|
|
|
var path = GetFullPath(key);
|
|
|
|
|
|
|
|
|
|
|
|
//错误打印,保护
|
|
|
|
|
|
if (audio == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError($"AudioManager, PlayMusic By Pos, Cant GetUsableAudio key:{key}");
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
audio.SetPos(pos);
|
|
|
|
|
|
audio.SetIsSpeak(false);
|
|
|
|
|
|
|
|
|
|
|
|
// if (_bgmAudio != null && _bgmAudio != audio)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// _bgmAudio.Stop();
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
audio.SetIsLoop(true);
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
if (isFade)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.SetVolume(0);
|
|
|
|
|
|
audio.SetTargetVolume(volume);
|
|
|
|
|
|
audio.PlayWithFade(path, fadeTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.Play(path);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//_bgmAudio = audio;
|
|
|
|
|
|
|
|
|
|
|
|
audio.SetIsLoop(isLoop);
|
|
|
|
|
|
return audio.audioID;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private int _PlaySound(string key, GameObject posObj = null, bool isLoop = false,
|
|
|
|
|
|
bool isFade = false, float fadeTime = 0f, float volume = 1f)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (GlobalSoundsVolume < 0.01f)
|
|
|
|
|
|
{
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
AudioInfo audioInfo = new AudioInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
persist = true,
|
|
|
|
|
|
volume = 1,
|
|
|
|
|
|
fadeInValue = 0.3f,
|
|
|
|
|
|
fadeOutValue = 0.3f,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
var audio = _GetUsableAudio(AudioBase.AudioType.Sound, isLoop);
|
|
|
|
|
|
|
|
|
|
|
|
//错误打印,保护
|
|
|
|
|
|
if (audio == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError($"AudioManager, PlaySound By Obj, Cant GetUsableAudio key:{key}");
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
var path = GetFullPath(key);
|
|
|
|
|
|
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
|
|
|
|
|
|
audio.SetPosObj(posObj);
|
|
|
|
|
|
audio.SetIsSpeak(false);
|
|
|
|
|
|
audio.SetIsLoop(isLoop);
|
|
|
|
|
|
if (posObj)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.SetIs3D(true);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (isFade)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.SetVolume(0);
|
|
|
|
|
|
audio.PlayWithFade(path);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.SetVolume(volume);
|
|
|
|
|
|
audio.Play(path);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
audio.SetIsLoop(isLoop);
|
|
|
|
|
|
return audio.audioID;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private int _PlaySound(string key, Vector3 pos, bool isLoop = false, bool isFade = false, float fadeTime = 0f, float volume = 1f)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (GlobalSoundsVolume < 0.01f)
|
|
|
|
|
|
{
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
AudioInfo audioInfo = new AudioInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
persist = true,
|
|
|
|
|
|
volume = 1,
|
|
|
|
|
|
fadeInValue = 0.3f,
|
|
|
|
|
|
fadeOutValue = 0.3f,
|
|
|
|
|
|
};
|
|
|
|
|
|
var audio = _GetUsableAudio(AudioBase.AudioType.Sound, isLoop);
|
|
|
|
|
|
|
|
|
|
|
|
//错误打印,保护
|
|
|
|
|
|
if (audio == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError($"AudioManager, PlaySound By Pos, Cant GetUsableAudio key:{key}");
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var path = GetFullPath(key);
|
|
|
|
|
|
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
|
|
|
|
|
|
audio.SetPos(pos);
|
|
|
|
|
|
audio.SetIsLoop(isLoop);
|
|
|
|
|
|
audio.SetIsSpeak(false);
|
|
|
|
|
|
audio.SetIs3D(true);
|
|
|
|
|
|
if (isFade)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.SetVolume(0);
|
|
|
|
|
|
audio.PlayWithFade(path, fadeTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.SetVolume(volume);
|
|
|
|
|
|
audio.Play(path);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
audio.SetIsLoop(isLoop);
|
|
|
|
|
|
return audio.audioID;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private int _PlaySpeakSound(string key, GameObject posObj = null, bool isFade = false, float fadeTime = 0f, float volume = 1f)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (GlobalSpeakVolume < 0.01f)
|
|
|
|
|
|
{
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
AudioInfo audioInfo = new AudioInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
persist = true,
|
|
|
|
|
|
volume = 1,
|
|
|
|
|
|
fadeInValue = 0.3f,
|
|
|
|
|
|
fadeOutValue = 0.3f,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
var audio = _GetUsableAudio(AudioBase.AudioType.Sound, false);
|
|
|
|
|
|
|
|
|
|
|
|
//错误打印,保护
|
|
|
|
|
|
if (audio == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError($"AudioManager, PlaySpeak By Obj, Cant GetUsableAudio key:{key}");
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-14 14:24:53 +08:00
|
|
|
|
var path = GetFullPath(key, true);
|
2025-03-10 13:12:05 +08:00
|
|
|
|
|
|
|
|
|
|
audio.SetPosObj(posObj);
|
|
|
|
|
|
audio.SetIsSpeak(true);
|
|
|
|
|
|
|
|
|
|
|
|
if (isFade)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.SetVolume(0);
|
|
|
|
|
|
audio.PlayWithFade(path, fadeTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.SetVolume(volume);
|
|
|
|
|
|
audio.Play(path);
|
|
|
|
|
|
}
|
|
|
|
|
|
audio.SetIsLoop(false);
|
|
|
|
|
|
|
|
|
|
|
|
return audio.audioID;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private int _PlaySpeakSound(string key, Vector3 pos, bool isFade = false, float fadeTime = 0f, float volume = 1f)
|
|
|
|
|
|
{
|
|
|
|
|
|
AudioInfo audioInfo = new AudioInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
persist = true,
|
|
|
|
|
|
volume = 1,
|
|
|
|
|
|
fadeInValue = 0.3f,
|
|
|
|
|
|
fadeOutValue = 0.3f,
|
|
|
|
|
|
};
|
|
|
|
|
|
var audio = _GetUsableAudio(AudioBase.AudioType.Sound, false);
|
2025-04-14 14:24:53 +08:00
|
|
|
|
var path = GetFullPath(key, true);
|
2025-03-10 13:12:05 +08:00
|
|
|
|
audio.SetPos(pos);
|
|
|
|
|
|
audio.SetIsSpeak(true);
|
|
|
|
|
|
if (isFade)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.SetVolume(0);
|
|
|
|
|
|
audio.PlayWithFade(path, fadeTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.SetVolume(volume);
|
|
|
|
|
|
audio.Play(path);
|
|
|
|
|
|
}
|
|
|
|
|
|
audio.SetIsLoop(false);
|
|
|
|
|
|
return audio.audioID;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void _PlayAudioByID(int id, string key, EPlayType type, GameObject posObj = null)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_soundAudioDic.TryGetValue(id, out var audio))
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private bool _CheckPath(string key)
|
|
|
|
|
|
{
|
|
|
|
|
|
var cfg = TableManager.Instance.Tables.AudioSourceConfig;
|
|
|
|
|
|
if (cfg.GetOrDefault(key) != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region API
|
|
|
|
|
|
|
|
|
|
|
|
public int PlayAudio(string key, AudioCriManager.EPlayType type, GameObject posObj = null, bool loop = false,
|
|
|
|
|
|
bool isFade = false, float fadeInTime = 4f)
|
|
|
|
|
|
{
|
|
|
|
|
|
// #if DEVELOPMENT_BUILD || DEBUG
|
|
|
|
|
|
// DebugUtil.Log("播放音频:{0}, type:{1}", key, type);
|
|
|
|
|
|
// #endif
|
|
|
|
|
|
if (!_CheckPath(key))
|
|
|
|
|
|
{
|
2025-03-10 14:08:22 +08:00
|
|
|
|
if (DebugUtil.LogEnable)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogG($"无法找到对应音频文件,key:{key}");
|
|
|
|
|
|
}
|
2025-03-10 13:12:05 +08:00
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
2025-04-16 12:24:10 +08:00
|
|
|
|
|
|
|
|
|
|
if (key == Constants.Sound.ERROR_UI || key == Constants.Sound.ERROR_UI_FIGHT)
|
|
|
|
|
|
{
|
|
|
|
|
|
EventManager.Instance.Send(EventManager.EventName.Audio_ErrorAudioPlay);
|
|
|
|
|
|
}
|
2025-03-10 13:12:05 +08:00
|
|
|
|
return _PlayAudio(key, type, posObj, loop, isFade, fadeInTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public int PlayAudio(string key, AudioCriManager.EPlayType type, Vector3 pos, bool loop = false,
|
|
|
|
|
|
bool isFade = false, float fadeInTime = 4f)
|
|
|
|
|
|
{
|
|
|
|
|
|
// #if DEVELOPMENT_BUILD || DEBUG
|
|
|
|
|
|
// DebugUtil.Log("播放音频:{0}, type:{1}", key, type);
|
|
|
|
|
|
// #endif
|
|
|
|
|
|
if (!_CheckPath(key))
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogG($"无法找到对应音频文件,key:{key}");
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
2025-04-16 12:24:10 +08:00
|
|
|
|
if (key == Constants.Sound.ERROR_UI || key == Constants.Sound.ERROR_UI_FIGHT)
|
|
|
|
|
|
{
|
|
|
|
|
|
EventManager.Instance.Send(EventManager.EventName.Audio_ErrorAudioPlay);
|
|
|
|
|
|
}
|
2025-03-10 13:12:05 +08:00
|
|
|
|
return _PlayAudio(key, type, pos, loop, isFade, fadeInTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public int PlayAudio()
|
|
|
|
|
|
{
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void InitLimit(int count0, int count1, int count2)
|
|
|
|
|
|
{
|
|
|
|
|
|
MusicPoolLimit = count0;
|
|
|
|
|
|
SoundPoolLimit = count1;
|
|
|
|
|
|
SpeakPoolLimit = count2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public AudioInst GetAudioByID(EPlayType audioType, int id)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (audioType == EPlayType.Music)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_musicAudioDic.ContainsKey(id))
|
|
|
|
|
|
{
|
|
|
|
|
|
return _musicAudioDic[id];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (_musicAudioLoopDic.ContainsKey(id))
|
|
|
|
|
|
{
|
|
|
|
|
|
return _musicAudioLoopDic[id];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (audioType == EPlayType.Sound || audioType == EPlayType.Speak)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_soundAudioDic.ContainsKey(id))
|
|
|
|
|
|
{
|
|
|
|
|
|
return _soundAudioDic[id];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (_soundAudioLoopDic.ContainsKey(id))
|
|
|
|
|
|
{
|
|
|
|
|
|
return _soundAudioLoopDic[id];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public AudioInst GetAudioByID(int id)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_musicAudioDic.ContainsKey(id))
|
|
|
|
|
|
{
|
|
|
|
|
|
return _musicAudioDic[id];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (_musicAudioLoopDic.ContainsKey(id))
|
|
|
|
|
|
{
|
|
|
|
|
|
return _musicAudioLoopDic[id];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (_soundAudioDic.ContainsKey(id))
|
|
|
|
|
|
{
|
|
|
|
|
|
return _soundAudioDic[id];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (_soundAudioLoopDic.ContainsKey(id))
|
|
|
|
|
|
{
|
|
|
|
|
|
return _soundAudioLoopDic[id];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void StopMusicById(int audioID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (audioID >= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(_musicAudioDic.TryGetValue(audioID, out var audio))
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(_musicAudioLoopDic.TryGetValue(audioID, out var audioLoop))
|
|
|
|
|
|
{
|
|
|
|
|
|
audioLoop.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void StopSoundByID(int audioID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (audioID >= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(_soundAudioDic.TryGetValue(audioID, out var audio))
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(_soundAudioLoopDic.TryGetValue(audioID, out var audioLoop))
|
|
|
|
|
|
{
|
|
|
|
|
|
audioLoop.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void StopByID(int audioID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (audioID >= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(_musicAudioDic.TryGetValue(audioID, out var audio))
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(_musicAudioLoopDic.TryGetValue(audioID, out var audioLoop))
|
|
|
|
|
|
{
|
|
|
|
|
|
audioLoop.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (_soundAudioDic.TryGetValue(audioID, out var soundAudio))
|
|
|
|
|
|
{
|
|
|
|
|
|
soundAudio.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(_soundAudioLoopDic.TryGetValue(audioID, out var audioLoop1))
|
|
|
|
|
|
{
|
|
|
|
|
|
audioLoop1.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-06-18 14:00:00 +08:00
|
|
|
|
|
|
|
|
|
|
public void PauseAllSound()
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var kv in _soundAudioDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var sound = kv.Value;
|
|
|
|
|
|
sound.Pause();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var kv in _soundAudioLoopDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var sound = kv.Value;
|
|
|
|
|
|
sound.Pause();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void ResumeAllSound()
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var kv in _soundAudioDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var sound = kv.Value;
|
|
|
|
|
|
sound.Resume();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var kv in _soundAudioLoopDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var sound = kv.Value;
|
|
|
|
|
|
sound.Resume();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-03-10 13:12:05 +08:00
|
|
|
|
|
|
|
|
|
|
public void StopAllMusic()
|
|
|
|
|
|
{
|
|
|
|
|
|
// if (_bgmAudio != null)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// _bgmAudio.Stop();
|
|
|
|
|
|
// }
|
|
|
|
|
|
DebugUtil.LogG("StopAllMusic");
|
|
|
|
|
|
foreach (var kv in _musicAudioDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var kv in _musicAudioLoopDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void StopAllSounds()
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogG("StopAllSounds");
|
|
|
|
|
|
foreach (var kv in _soundAudioDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var kv in _soundAudioLoopDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void StopAllSpeaks()
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogG("StopAllSpeaks");
|
|
|
|
|
|
foreach (var kv in _soundAudioDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
if(audio.IsSpeak)
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void StopAll()
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogG("StopAll");
|
|
|
|
|
|
foreach (var kv in _allAudioDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void StopWithFadeByID(int audioID, float fadeOutTime = 1f)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (audioID >= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(_musicAudioDic.TryGetValue(audioID, out var audio))
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.StopWithFade(fadeOutTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(_musicAudioLoopDic.TryGetValue(audioID, out var audioLoop))
|
|
|
|
|
|
{
|
|
|
|
|
|
audioLoop.StopWithFade(fadeOutTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (_soundAudioDic.TryGetValue(audioID, out var soundAudio))
|
|
|
|
|
|
{
|
|
|
|
|
|
soundAudio.StopWithFade(fadeOutTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(_soundAudioLoopDic.TryGetValue(audioID, out var audioLoop1))
|
|
|
|
|
|
{
|
|
|
|
|
|
audioLoop1.StopWithFade(fadeOutTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void ResumeAllMusic()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
// if (_bgmAudio != null)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// _bgmAudio.Resume();
|
|
|
|
|
|
// }
|
|
|
|
|
|
foreach (var kv in _musicAudioDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
audio.Resume();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var kv in _musicAudioLoopDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
audio.Resume();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void StopBGM()
|
|
|
|
|
|
{
|
|
|
|
|
|
_bgmAudioCri.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void AfterSwitchMainCamera(Camera camera)
|
|
|
|
|
|
{
|
2025-04-02 15:00:32 +08:00
|
|
|
|
//if(AudioManager.Instance.GlobalIsSpeakOpen)
|
2025-03-10 13:12:05 +08:00
|
|
|
|
var listener = camera.GetComponent<AudioListener>();
|
2025-04-02 15:00:32 +08:00
|
|
|
|
if (listener)
|
2025-03-10 13:12:05 +08:00
|
|
|
|
{
|
2025-04-02 15:00:32 +08:00
|
|
|
|
Object.DestroyImmediate(listener);
|
2025-03-10 13:12:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// public CriAtomExAcb GetAcb(string cueSheetName)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// return this.CriAtom.GetAcb(cueSheetName);
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
2025-05-30 13:40:27 +08:00
|
|
|
|
public AudioInst GetStoryAudioInst(AudioBase.AudioType audioType)
|
2025-03-10 13:12:05 +08:00
|
|
|
|
{
|
2025-05-30 13:40:27 +08:00
|
|
|
|
return _CreateStoryAudio(null, audioType);
|
2025-03-10 13:12:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void ReleaseStoryAudios()
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var kv in _storyAudioDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
Object.Destroy(audio.RootGo);
|
|
|
|
|
|
_allAudioDic.Remove(audio.audioID);
|
|
|
|
|
|
}
|
|
|
|
|
|
_storyAudioDic.Clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void PlayByCueName(int audioID, string cueName, bool isFade = false, float fadeOutTime = 4f)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_allAudioDic.TryGetValue(audioID, out var audio))
|
|
|
|
|
|
{
|
2025-04-14 17:01:03 +08:00
|
|
|
|
var fullPath = GetFullPath(cueName);
|
2025-03-10 13:12:05 +08:00
|
|
|
|
if (isFade)
|
|
|
|
|
|
{
|
2025-04-14 17:01:03 +08:00
|
|
|
|
audio.PlayWithFade(fullPath, fadeOutTime);
|
2025-03-10 13:12:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2025-04-14 17:01:03 +08:00
|
|
|
|
audio.Play(fullPath);
|
2025-03-10 13:12:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void PlayByCueName(int audioID, string cueName, float fadeInTime, float targetVolume)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_allAudioDic.TryGetValue(audioID, out var audio))
|
|
|
|
|
|
{
|
2025-04-14 16:03:27 +08:00
|
|
|
|
var fullPath = GetFullPath(cueName);
|
2025-03-10 13:12:05 +08:00
|
|
|
|
audio.SetTargetVolume(targetVolume);
|
2025-04-14 16:03:27 +08:00
|
|
|
|
audio.PlayWithFade(fullPath, fadeInTime);
|
2025-03-10 13:12:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void ReleaseMusicAudios()
|
|
|
|
|
|
{
|
|
|
|
|
|
var musicAudioList = _musicAudioDic.ToList();
|
|
|
|
|
|
for (int i = musicAudioList.Count - 1; i >= 0; i--)
|
|
|
|
|
|
{
|
|
|
|
|
|
var kv = musicAudioList[i];
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
var audioID = kv.Key;
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
_musicAudioDic.Remove(audioID);
|
|
|
|
|
|
_allAudioDic.Remove(audioID);
|
|
|
|
|
|
Object.Destroy(audio.RootGo);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var musicAudioLoopList = _musicAudioLoopDic.ToList();
|
|
|
|
|
|
for (int i = musicAudioLoopList.Count - 1; i >= 0; i--)
|
|
|
|
|
|
{
|
|
|
|
|
|
var kv = musicAudioLoopList[i];
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
var audioID = kv.Key;
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
_musicAudioLoopDic.Remove(audioID);
|
|
|
|
|
|
_allAudioDic.Remove(audioID);
|
|
|
|
|
|
Object.Destroy(audio.RootGo);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_musicAudioObj.Clear();
|
|
|
|
|
|
_musicAudioDic.Clear();
|
|
|
|
|
|
_musicAudioLoopObj.Clear();
|
|
|
|
|
|
_musicAudioLoopDic.Clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void ReleaseSoundsAudios()
|
|
|
|
|
|
{
|
|
|
|
|
|
var soundAudioList = _soundAudioDic.ToList();
|
|
|
|
|
|
for (int i = soundAudioList.Count - 1; i >= 0; i--)
|
|
|
|
|
|
{
|
|
|
|
|
|
var kv = soundAudioList[i];
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
var audioID = kv.Key;
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
_soundAudioDic.Remove(audioID);
|
|
|
|
|
|
_allAudioDic.Remove(audioID);
|
|
|
|
|
|
Object.Destroy(audio.RootGo);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var soundAudioLoopList = _soundAudioLoopDic.ToList();
|
|
|
|
|
|
for (int i = soundAudioLoopList.Count - 1; i >= 0; i--)
|
|
|
|
|
|
{
|
|
|
|
|
|
var kv = soundAudioLoopList[i];
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
var audioID = kv.Key;
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
_soundAudioLoopDic.Remove(audioID);
|
|
|
|
|
|
_allAudioDic.Remove(audioID);
|
|
|
|
|
|
Object.Destroy(audio.RootGo);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_soundAudioObj.Clear();
|
|
|
|
|
|
_soundAudioDic.Clear();
|
|
|
|
|
|
_soundAudioLoopObj.Clear();
|
|
|
|
|
|
_soundAudioLoopDic.Clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void ReleaseAllAudios()
|
|
|
|
|
|
{
|
|
|
|
|
|
ReleaseMusicAudios();
|
|
|
|
|
|
ReleaseSoundsAudios();
|
2025-04-09 17:46:50 +08:00
|
|
|
|
foreach (var playTypeAudios in _playingLDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
playTypeAudios.Value.Clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
_allAudioDic.Clear();
|
2025-06-24 14:58:32 +08:00
|
|
|
|
AudioUnity.ResetPlayID();
|
2025-03-10 13:12:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// public long GetCueLength(string cueSheet, string cueName)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// var acb = CriAtom.GetCueSheetInternal(cueSheet).acb;
|
|
|
|
|
|
// if (acb.GetCueInfo(cueName, out var cueInfo))
|
|
|
|
|
|
// {
|
|
|
|
|
|
// var length = cueInfo.length / 1000;
|
|
|
|
|
|
// return length;
|
|
|
|
|
|
// }
|
|
|
|
|
|
//
|
|
|
|
|
|
// return -1;
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
public void Add2Playing(AudioBase.AudioType audioType, int id, bool isSpeak = false)
|
|
|
|
|
|
{
|
|
|
|
|
|
PlayType type;
|
|
|
|
|
|
if (audioType == AudioBase.AudioType.Music)
|
|
|
|
|
|
{
|
|
|
|
|
|
type = PlayType.Music;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
if (isSpeak)
|
|
|
|
|
|
type = PlayType.Speak;
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
type = PlayType.Sound;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
var list = _playingLDic[type];
|
|
|
|
|
|
if (!list.Contains(id))
|
|
|
|
|
|
{
|
|
|
|
|
|
list.Add(id);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void RemovePlaying(AudioBase.AudioType audioType, int id, bool isSpeak = false)
|
|
|
|
|
|
{
|
|
|
|
|
|
PlayType type;
|
|
|
|
|
|
if (audioType == AudioBase.AudioType.Music)
|
|
|
|
|
|
{
|
|
|
|
|
|
type = PlayType.Music;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
if (isSpeak)
|
|
|
|
|
|
type = PlayType.Speak;
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
type = PlayType.Sound;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
var list = _playingLDic[type];
|
|
|
|
|
|
if (list.Contains(id))
|
|
|
|
|
|
{
|
|
|
|
|
|
list.Remove(id);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void RemovePlaying(int id)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var kv in _playingLDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var list = kv.Value;
|
|
|
|
|
|
if (list.Contains(id))
|
|
|
|
|
|
{
|
|
|
|
|
|
list.Remove(id);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public async UniTask<float> GetClipLength(string key)
|
|
|
|
|
|
{
|
|
|
|
|
|
var path = GetFullPath(key);
|
|
|
|
|
|
var clip = await AssetManager.Instance.LoadAssetAsync<AudioClip>(path);
|
|
|
|
|
|
if (clip)
|
|
|
|
|
|
{
|
|
|
|
|
|
return clip.length;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
2025-06-24 14:58:32 +08:00
|
|
|
|
|
|
|
|
|
|
public AudioInst GetSoundByPlayID(long playID)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var kv in _soundAudioDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
if (audio.PlayID == playID)
|
|
|
|
|
|
{
|
|
|
|
|
|
return audio;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var kv in _soundAudioLoopDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = kv.Value;
|
|
|
|
|
|
if (audio.PlayID == playID)
|
|
|
|
|
|
{
|
|
|
|
|
|
return audio;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
2025-03-10 13:12:05 +08:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
2025-04-02 15:00:32 +08:00
|
|
|
|
#region Listener
|
|
|
|
|
|
|
|
|
|
|
|
private void _SetListenerPos()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (AudioRoot && _isFollowCamera)
|
|
|
|
|
|
{
|
|
|
|
|
|
var camera = CameraManager.Instance.MainCamera;
|
2025-04-08 16:50:58 +08:00
|
|
|
|
if (camera)
|
|
|
|
|
|
{
|
|
|
|
|
|
AudioRoot.transform.position = camera.transform.position;
|
|
|
|
|
|
}
|
2025-04-02 15:00:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void _InitListenerPos()
|
|
|
|
|
|
{
|
|
|
|
|
|
AudioRoot.transform.position = new Vector3(0, 0, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void EnterFollowState()
|
|
|
|
|
|
{
|
|
|
|
|
|
_isFollowCamera = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void ExitFollowState()
|
|
|
|
|
|
{
|
|
|
|
|
|
_isFollowCamera = false;
|
|
|
|
|
|
_InitListenerPos();
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
2025-04-16 12:24:10 +08:00
|
|
|
|
#region Events
|
|
|
|
|
|
|
|
|
|
|
|
private void _OnErrorAudioPlay()
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var kv in _soundAudioDic)
|
|
|
|
|
|
{
|
|
|
|
|
|
var sound = kv.Value;
|
|
|
|
|
|
if (sound.IsPlaying)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (sound.Clip.name == Constants.Sound.COMMON_CLAIM || sound.Clip.name == Constants.Sound.COMMON_CLICK)
|
|
|
|
|
|
{
|
|
|
|
|
|
sound.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
2025-03-10 13:12:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public struct AudioInfo
|
|
|
|
|
|
{
|
|
|
|
|
|
public bool persist;
|
|
|
|
|
|
public float volume;
|
|
|
|
|
|
public float fadeInValue;
|
|
|
|
|
|
public float fadeOutValue;
|
|
|
|
|
|
public bool isSpeak;
|
|
|
|
|
|
}
|
|
|
|
|
|
public class AudioInst : AudioUnity
|
|
|
|
|
|
{
|
|
|
|
|
|
public AudioInst(AudioType audioType, GameObject rootGo, GameObject posGo, AudioInfo audioInfo = new(),
|
|
|
|
|
|
bool loop = false, bool is3D = false):base(audioType, rootGo, posGo, audioInfo, loop, is3D)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-04-16 17:58:35 +08:00
|
|
|
|
|
|
|
|
|
|
public void GetSpectrumData(float[] spectrums)
|
|
|
|
|
|
{
|
|
|
|
|
|
_audioSource.GetSpectrumData(spectrums, 0, FFTWindow.Blackman);
|
|
|
|
|
|
}
|
2025-03-10 13:12:05 +08:00
|
|
|
|
}
|