com.alicizax.unity.framework/Runtime/Audio/AudioComponent.cs
陈思海 46194ddee8 重构音频模块 1. 高频、大量音频反复调用时,单帧 CPU 开销与 GC 最优 2. AudioClip / AudioSource 的加载、缓存淘汰、卸载形成完整闭环,避免线性遍历 3. AudioSource 对象池 + 播放请求 struct 全部池化覆盖所有分配点 4. 支持3D环境音并具备距离衰减、遮挡等空间属性 5. 新增音频类型(BGM/SFX/Voice/Ambient) 6. 可调式监控Debug信息 及时跟踪音频缓存 处理 句柄状态
重构音频模块
1. 高频、大量音频反复调用时,单帧 CPU 开销与 GC 最优
2. AudioClip / AudioSource 的加载、缓存淘汰、卸载形成完整闭环,避免线性遍历
3. AudioSource 对象池 + 播放请求 struct 全部池化覆盖所有分配点
4. 支持3D环境音并具备距离衰减、遮挡等空间属性
5. 新增音频类型(BGM/SFX/Voice/Ambient)
6. 可调式监控Debug信息 及时跟踪音频缓存 处理 句柄状态
2026-04-23 17:21:36 +08:00

73 lines
2.0 KiB
C#

using AlicizaX;
using UnityEngine;
using UnityEngine.Audio;
namespace AlicizaX.Audio.Runtime
{
[DisallowMultipleComponent]
[AddComponentMenu("Game Framework/Audio")]
public sealed class AudioComponent : MonoBehaviour
{
[SerializeField] private AudioMixer m_AudioMixer;
[SerializeField] private Transform m_InstanceRoot;
[SerializeField] private AudioListener m_AudioListener;
[SerializeField] private AudioGroupConfigCollection m_AudioGroupConfigs;
private IAudioService _audioService;
private void Awake()
{
_audioService = AppServices.RegisterApp(new AudioService());
}
private void Start()
{
EnsureInstanceRoot();
EnsureAudioMixer();
AudioGroupConfig[] configs = m_AudioGroupConfigs != null ? m_AudioGroupConfigs.GroupConfigs : null;
_audioService.Initialize(configs, m_InstanceRoot, m_AudioMixer);
if (m_AudioListener != null)
{
_audioService.RegisterListener(m_AudioListener);
}
}
private void OnEnable()
{
if (_audioService != null && m_AudioListener != null)
{
_audioService.RegisterListener(m_AudioListener);
}
}
private void OnDisable()
{
if (_audioService != null && m_AudioListener != null)
{
_audioService.UnregisterListener(m_AudioListener);
}
}
private void EnsureInstanceRoot()
{
if (m_InstanceRoot != null)
{
return;
}
m_InstanceRoot = new GameObject("[AudioService Instances]").transform;
m_InstanceRoot.SetParent(transform, false);
m_InstanceRoot.localScale = Vector3.one;
}
private void EnsureAudioMixer()
{
if (m_AudioMixer == null)
{
m_AudioMixer = Resources.Load<AudioMixer>("AudioMixer");
}
}
}
}