using System.Collections.Generic; using AlicizaX.Resource.Runtime; using AlicizaX.Runtime; using UnityEngine; using UnityEngine.Audio; namespace AlicizaX.Audio.Runtime { /// /// 音效管理,为游戏提供统一的音效播放接口。 /// /// 场景3D音效挂到场景物件、技能3D音效挂到技能特效上,并在AudioSource的Output上设置对应分类的AudioMixerGroup [DisallowMultipleComponent] [AddComponentMenu("Game Framework/Audio")] public sealed class AudioComponent : GameFrameworkComponent { [SerializeField] private AudioMixer m_AudioMixer; [SerializeField] private Transform m_InstanceRoot = null; [SerializeField] private AudioGroupConfig[] m_AudioGroupConfigs = null; public IAudioManager m_AudioManager; #region Public Propreties /// /// 音频混响器。 /// public AudioMixer MAudioMixer => m_AudioMixer; /// /// 实例化根节点。 /// public Transform InstanceRoot { get => m_InstanceRoot; set => m_InstanceRoot = value; } /// /// 总音量控制。 /// public float Volume { get => m_AudioManager.Volume; set => m_AudioManager.Volume = value; } /// /// 总开关。 /// public bool Enable { get => m_AudioManager.Enable; set => m_AudioManager.Enable = value; } /// /// 音乐音量。 /// public float MusicVolume { get => m_AudioManager.MusicVolume; set => m_AudioManager.MusicVolume = value; } /// /// 音效音量。 /// public float SoundVolume { get => m_AudioManager.SoundVolume; set => m_AudioManager.SoundVolume = value; } /// /// UI音效音量。 /// public float UISoundVolume { get => m_AudioManager.UISoundVolume; set => m_AudioManager.UISoundVolume = value; } /// /// 语音音量。 /// public float VoiceVolume { get => m_AudioManager.VoiceVolume; set => m_AudioManager.VoiceVolume = value; } /// /// 音乐开关 /// public bool MusicEnable { get => m_AudioManager.MusicEnable; set => m_AudioManager.MusicEnable = value; } /// /// 音效开关。 /// public bool SoundEnable { get => m_AudioManager.SoundEnable; set => m_AudioManager.SoundEnable = value; } /// /// UI音效开关。 /// public bool UISoundEnable { get => m_AudioManager.UISoundEnable; set => m_AudioManager.UISoundEnable = value; } /// /// 语音开关。 /// public bool VoiceEnable { get => m_AudioManager.VoiceEnable; set => m_AudioManager.VoiceEnable = value; } #endregion protected override void Awake() { ImplementationComponentType = Utility.Assembly.GetType(componentType); InterfaceComponentType = typeof(IAudioManager); base.Awake(); m_AudioManager = SysModuleCenter.GetModule(); } /// /// 初始化音频模块。 /// void Start() { if (m_InstanceRoot == null) { m_InstanceRoot = new GameObject("AudioModule Instances").transform; m_InstanceRoot.SetParent(gameObject.transform); m_InstanceRoot.localScale = Vector3.one; } if (m_AudioMixer == null) { m_AudioMixer = Resources.Load("AudioMixer"); } m_AudioManager.Initialize(m_AudioGroupConfigs, m_InstanceRoot, m_AudioMixer); m_AudioManager.SetResourceManager(SysModuleCenter.GetModule()); } /// /// 重启音频模块。 /// public void Restart() { m_AudioManager.Restart(); } /// /// 播放,如果超过最大发声数采用fadeout的方式复用最久播放的AudioSource。 /// /// 声音类型 /// 声音文件路径 /// 是否循环播放> /// 音量(0-1.0) /// 是否异步加载 /// 是否支持资源池 public AudioAgent Play(AudioType type, string path, bool bLoop = false, float volume = 1.0f, bool bAsync = false, bool bInPool = false) { return m_AudioManager.Play(type, path, bLoop, volume, bAsync, bInPool); } /// /// 停止某类声音播放。 /// /// 声音类型。 /// 是否渐消。 public void Stop(AudioType type, bool fadeout) { m_AudioManager.Stop(type, fadeout); } /// /// 停止所有声音。 /// /// 是否渐消。 public void StopAll(bool fadeout) { m_AudioManager.StopAll(fadeout); } /// /// 预先加载AudioClip,并放入对象池。 /// /// AudioClip的AssetPath集合。 public void PutInAudioPool(List list) { m_AudioManager.PutInAudioPool(list); } /// /// 将部分AudioClip从对象池移出。 /// /// AudioClip的AssetPath集合。 public void RemoveClipFromPool(List list) { m_AudioManager.RemoveClipFromPool(list); } /// /// 清空AudioClip的对象池。 /// public void CleanSoundPool() { m_AudioManager.CleanSoundPool(); } } }