重构音频模块 1. 高频、大量音频反复调用时,单帧 CPU 开销与 GC 最优 2. AudioClip / AudioSource 的加载、缓存淘汰、卸载形成完整闭环,避免线性遍历 3. AudioSource 对象池 + 播放请求 struct 全部池化覆盖所有分配点 4. 支持3D环境音并具备距离衰减、遮挡等空间属性 5. 新增音频类型(BGM/SFX/Voice/Ambient) 6. 可调式监控Debug信息 及时跟踪音频缓存 处理 句柄状态
73 lines
3.5 KiB
C#
73 lines
3.5 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace AlicizaX.Audio.Runtime
|
|
{
|
|
[Serializable]
|
|
public sealed class AudioGroupConfig
|
|
{
|
|
[SerializeField] private string m_Name = null;
|
|
[SerializeField] private bool m_Mute = false;
|
|
[SerializeField, Range(0f, 1f)] private float m_Volume = 1f;
|
|
[SerializeField, Min(1)] private int m_AgentHelperCount = 8;
|
|
[SerializeField] private string m_ExposedVolumeParameter = null;
|
|
[SerializeField, Range(0f, 1f)] private float m_SpatialBlend = 1f;
|
|
[SerializeField, Range(0f, 5f)] private float m_DopplerLevel = 1f;
|
|
[SerializeField, Range(0f, 360f)] private float m_Spread = 0f;
|
|
[SerializeField, Range(0, 256)] private int m_SourcePriority = 128;
|
|
[SerializeField, Range(0f, 1.1f)] private float m_ReverbZoneMix = 1f;
|
|
[SerializeField] private bool m_OcclusionEnabled = false;
|
|
[SerializeField] private LayerMask m_OcclusionMask = ~0;
|
|
[SerializeField, Min(0.02f)] private float m_OcclusionCheckInterval = 0.12f;
|
|
[SerializeField, Range(500f, 22000f)] private float m_OcclusionLowPassCutoff = 1200f;
|
|
[SerializeField, Range(0f, 1f)] private float m_OcclusionVolumeMultiplier = 0.55f;
|
|
|
|
public AudioType AudioType;
|
|
public AudioRolloffMode audioRolloffMode = AudioRolloffMode.Logarithmic;
|
|
public float minDistance = 1f;
|
|
public float maxDistance = 500f;
|
|
|
|
public string Name => m_Name;
|
|
public bool Mute => m_Mute;
|
|
public float Volume => m_Volume;
|
|
public int AgentHelperCount => m_AgentHelperCount > 0 ? m_AgentHelperCount : 1;
|
|
public string ExposedVolumeParameter => m_ExposedVolumeParameter;
|
|
public float SpatialBlend => m_SpatialBlend;
|
|
public float DopplerLevel => m_DopplerLevel;
|
|
public float Spread => m_Spread;
|
|
public int SourcePriority => m_SourcePriority;
|
|
public float ReverbZoneMix => m_ReverbZoneMix;
|
|
public bool OcclusionEnabled => m_OcclusionEnabled;
|
|
public LayerMask OcclusionMask => m_OcclusionMask;
|
|
public float OcclusionCheckInterval => m_OcclusionCheckInterval;
|
|
public float OcclusionLowPassCutoff => m_OcclusionLowPassCutoff;
|
|
public float OcclusionVolumeMultiplier => m_OcclusionVolumeMultiplier;
|
|
public AudioRolloffMode RolloffMode => audioRolloffMode;
|
|
public float MinDistance => minDistance;
|
|
public float MaxDistance => maxDistance;
|
|
|
|
internal void SetDefaults(AudioType type, string name, string exposedVolumeParameter, int agentHelperCount, float spatialBlend, bool occlusionEnabled)
|
|
{
|
|
AudioType = type;
|
|
m_Name = name;
|
|
m_Mute = false;
|
|
m_Volume = 1f;
|
|
m_AgentHelperCount = agentHelperCount;
|
|
m_ExposedVolumeParameter = exposedVolumeParameter;
|
|
m_SpatialBlend = spatialBlend;
|
|
m_DopplerLevel = 1f;
|
|
m_Spread = 0f;
|
|
m_SourcePriority = type == AudioType.Music ? 32 : 128;
|
|
m_ReverbZoneMix = 1f;
|
|
m_OcclusionEnabled = occlusionEnabled;
|
|
m_OcclusionMask = ~0;
|
|
m_OcclusionCheckInterval = 0.12f;
|
|
m_OcclusionLowPassCutoff = 1200f;
|
|
m_OcclusionVolumeMultiplier = 0.55f;
|
|
audioRolloffMode = AudioRolloffMode.Logarithmic;
|
|
minDistance = type == AudioType.Music || type == AudioType.UISound ? 1f : 2f;
|
|
maxDistance = type == AudioType.Music || type == AudioType.UISound ? 25f : 80f;
|
|
}
|
|
}
|
|
}
|