com.alicizax.unity.framework/Editor/Audio/AudioEmitterInspector.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

122 lines
5.4 KiB
C#

using AlicizaX.Audio.Runtime;
using UnityEditor;
namespace AlicizaX.Audio.Editor
{
[CustomEditor(typeof(AudioEmitter))]
internal sealed class AudioEmitterInspector : UnityEditor.Editor
{
private SerializedProperty _audioType;
private SerializedProperty _clipMode;
private SerializedProperty _address;
private SerializedProperty _clip;
private SerializedProperty _playOnEnable;
private SerializedProperty _loop;
private SerializedProperty _volume;
private SerializedProperty _async;
private SerializedProperty _cacheClip;
private SerializedProperty _stopWithFadeout;
private SerializedProperty _followSelf;
private SerializedProperty _followOffset;
private SerializedProperty _spatialBlend;
private SerializedProperty _rolloffMode;
private SerializedProperty _minDistance;
private SerializedProperty _maxDistance;
private SerializedProperty _useTriggerRange;
private SerializedProperty _triggerRange;
private SerializedProperty _triggerHysteresis;
private SerializedProperty _drawGizmos;
private SerializedProperty _drawOnlyWhenSelected;
private SerializedProperty _triggerColor;
private SerializedProperty _minDistanceColor;
private SerializedProperty _maxDistanceColor;
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.LabelField("Playback", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(_audioType);
EditorGUILayout.PropertyField(_clipMode);
if (_clipMode.enumValueIndex == 1)
{
EditorGUILayout.PropertyField(_clip);
}
else
{
EditorGUILayout.PropertyField(_address);
EditorGUILayout.PropertyField(_async);
EditorGUILayout.PropertyField(_cacheClip);
}
EditorGUILayout.PropertyField(_playOnEnable);
EditorGUILayout.PropertyField(_loop);
EditorGUILayout.PropertyField(_volume);
EditorGUILayout.PropertyField(_stopWithFadeout);
EditorGUILayout.Space();
EditorGUILayout.LabelField("Spatial", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(_followSelf);
EditorGUILayout.PropertyField(_followOffset);
EditorGUILayout.PropertyField(_spatialBlend);
EditorGUILayout.PropertyField(_rolloffMode);
EditorGUILayout.PropertyField(_minDistance);
EditorGUILayout.PropertyField(_maxDistance);
EditorGUILayout.Space();
EditorGUILayout.LabelField("Trigger", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(_useTriggerRange);
if (_useTriggerRange.boolValue)
{
EditorGUILayout.PropertyField(_triggerRange);
EditorGUILayout.PropertyField(_triggerHysteresis);
}
EditorGUILayout.Space();
EditorGUILayout.LabelField("Gizmos", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(_drawGizmos);
if (_drawGizmos.boolValue)
{
EditorGUILayout.PropertyField(_drawOnlyWhenSelected);
if (_useTriggerRange.boolValue)
{
EditorGUILayout.PropertyField(_triggerColor);
}
EditorGUILayout.PropertyField(_minDistanceColor);
EditorGUILayout.PropertyField(_maxDistanceColor);
}
serializedObject.ApplyModifiedProperties();
}
private void OnEnable()
{
_audioType = serializedObject.FindProperty("m_AudioType");
_clipMode = serializedObject.FindProperty("m_ClipMode");
_address = serializedObject.FindProperty("m_Address");
_clip = serializedObject.FindProperty("m_Clip");
_playOnEnable = serializedObject.FindProperty("m_PlayOnEnable");
_loop = serializedObject.FindProperty("m_Loop");
_volume = serializedObject.FindProperty("m_Volume");
_async = serializedObject.FindProperty("m_Async");
_cacheClip = serializedObject.FindProperty("m_CacheClip");
_stopWithFadeout = serializedObject.FindProperty("m_StopWithFadeout");
_followSelf = serializedObject.FindProperty("m_FollowSelf");
_followOffset = serializedObject.FindProperty("m_FollowOffset");
_spatialBlend = serializedObject.FindProperty("m_SpatialBlend");
_rolloffMode = serializedObject.FindProperty("m_RolloffMode");
_minDistance = serializedObject.FindProperty("m_MinDistance");
_maxDistance = serializedObject.FindProperty("m_MaxDistance");
_useTriggerRange = serializedObject.FindProperty("m_UseTriggerRange");
_triggerRange = serializedObject.FindProperty("m_TriggerRange");
_triggerHysteresis = serializedObject.FindProperty("m_TriggerHysteresis");
_drawGizmos = serializedObject.FindProperty("m_DrawGizmos");
_drawOnlyWhenSelected = serializedObject.FindProperty("m_DrawOnlyWhenSelected");
_triggerColor = serializedObject.FindProperty("m_TriggerColor");
_minDistanceColor = serializedObject.FindProperty("m_MinDistanceColor");
_maxDistanceColor = serializedObject.FindProperty("m_MaxDistanceColor");
}
}
}