关于 Unity Audio
面向使用 Unity 6+ 构建游戏音频系统的开发者,指导音频功能的设计与实现。内容涵盖对象池音效、音乐转场、3D 空间音频、混音器和性能分析,并采用 ScriptableObjects 与事件驱动模式。
主要功能
- 01构建音效对象池系统
- 02在音乐曲目间交叉淡化
- 03设置 3D 音频与环境声
- 04配置 AudioMixer 快照
- 05使用 Audio Random Containers
- 06分析音频声部与内存
适用场景
- 01为 Unity 游戏添加可复用音效
- 02在场景或状态间切换音乐
- 03通过触发区域设置空间环境声
- 04排查音频声部与内存问题
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ juliankerignard/ unity-skills --skill unity-audio安装后在 Claude Code 中输入/unity-audio确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/audio-patterns.mdaudio-advanced.mdaudio-optimization.md详细介绍
Unity Audio
此技能的功能
指导在 Unity 6+ 中设计和实现完整的音频系统。涵盖带对象池的音效、带交叉淡化的音乐、环境音、3D 空间化、Audio Random Containers(Unity 6+)、AudioMixer 快照,并介绍 Scriptable Audio Pipeline(Unity 6.3+)。生成基于 ScriptableObjects 和事件驱动模式的高性能代码。
前提条件
- Unity 6.0+(Scriptable Audio Pipeline 需要 6.3+)
- 默认 Audio 包(内置)
- 具备 AudioSource、AudioClip、AudioMixer 的基础知识
- 已加载
/unity技能(架构、SO 模式)
快速开始
- 描述需求:声音类型(SFX、音乐、环境音)、使用场景(2D/3D/VR)
- 遵循决策树,选择合适的模式
- 创建基于 ScriptableObject 的 AudioManager 和 SoundEmitter 对象池
- 配置导入设置,匹配音频类型(参见
references/audio-optimization.md) - 测试,使用 Profiler Audio 并通过 AudioMixer 调整音量
决策树
Type de son ?
|
+-- SFX ponctuel (tir, saut, UI click) ?
| +-- Peu de variations --> AudioSource.PlayOneShot + pool
| +-- Variations (footsteps, impacts) --> Audio Random Container (Unity 6+)
|
+-- Musique (BGM, themes) ?
| +-- Un seul theme --> AudioSource loop
| +-- Transitions entre themes --> Crossfade 2 sources
| +-- Musique dynamique --> AudioMixer snapshots
|
+-- Ambiance (vent, foule, pluie) ?
| +-- Globale --> AudioSource loop sur Camera/Manager
| +-- Locale (zone) --> AudioSource 3D + trigger zone
|
+-- Son spatial 3D ?
| +-- Standard --> spatialBlend = 1, Logarithmic rolloff
| +-- VR/AR --> Spatializer plugin (Steam Audio, Resonance)
|
+-- Custom DSP / synthese ?
+-- Unity 6.3+ --> Scriptable Audio Pipeline
分步指南
步骤 1:检测现有的 AudioMixer
检查项目中是否存在 AudioMixer。若不存在,则创建一个并添加以下组:
- Master(全局音量)
- SFX(音效)
- Music(音乐)
- Ambiance(环境音)
- UI(界面音效)
公开每个组的音量参数(SFXVolume、MusicVolume 等)。
步骤 2:设置 AudioManager SO
创建基于 ScriptableObjects 的系统:
AudioCueSO:包含音频片段、音量/音高范围、目标混音器组AudioCueEventChannelSO:事件通道,用于解耦播放请求AudioManagerMonoBehaviour:监听通道并管理 SoundEmitters 对象池
完整实现(AudioCueSO、SoundEmitter、对象池、交叉淡化)请参见 references/audio-patterns.md。
步骤 3:配置导入设置
根据音频类型,为每个音频片段应用最佳设置:
- 短音效:Decompress On Load、Vorbis 70%、Force Mono
- 音乐:Streaming、Vorbis 50%、Stereo
- 环境音:Streaming、Vorbis 50%、Force Mono
- UI:Decompress On Load、PCM、Force Mono
完整表格请参见 references/audio-optimization.md。
步骤 4:实现模式
根据决策树选择:
- SFX:带自动归还功能的 SoundEmitters 对象池
- 音乐:通过
Awaitable在 2 个 AudioSource 之间交叉淡化 - 环境音:带触发区域的 3D AudioSource
- 空间化:配置衰减曲线、最小/最大距离和多普勒效应
- AudioMixer 快照:环境转换(战斗、暂停、水下)
Mixer 快照、3D 空间化和 Audio Random Container 模式请参见 references/audio-advanced.md。
步骤 5:测试和性能分析
- 打开 Window > Analysis > Audio Profiler
- 检查活动声部数量(预算:移动平台 32 个,桌面平台 64 个)
- 在 Profiler 中检查音频内存(Memory > Audio 选项卡)
- 测试 AudioMixer 快照转换
- 在场景中使用音频 Gizmos 验证 3D 空间化
严格规则
始终:
- 对一次性 SFX 使用
PlayOneShot()(不要使用Play()) - 使用 SoundEmitter 池(绝不为每个声音调用
Instantiate) - 通过
AudioMixer.SetFloat()暴露音量(不要直接使用AudioSource.volume) - 在游戏中使用剪辑之前,先配置导入设置
- 在每个 AudioSource 上使用
AudioMixerGroup进行路由 - 将音量转换为 dB:
Mathf.Log10(value) * 20f - 限制每个类别的同时发声数(最大声音数)
绝不:
- 使用
new AudioClip(),或在每一帧加载剪辑 - 对快速、重叠的 SFX 使用
AudioSource.Play() - 播放结束后忘记将 emitter 归还到池中
- 对大于 500 Ko 的文件让 AudioSource 使用
Decompress On Load - 对音频 GameObject 使用
Destroy()(通过池回收) - 忽略
spatialBlend(默认值 0 = 2D,常被遗忘,导致 3D 音频出错)
相关技能
/unity-code-gen:生成 AudioManager、SoundEmitter、AudioCueSO 代码/proto:使用占位音频快速制作原型/perf-audit:检测音频反模式(内存、声音数)/unity-test:在 EditMode 中测试音频系统
故障排除
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 没有声音 | AudioSource 已禁用或音量为 0 | 检查 enabled、volume,确认 AudioMixerGroup 未静音 |
| 3D 声音听不见 | spatialBlend = 0(2D 模式) | 将 spatialBlend 设为 1,并检查 maxDistance |
| 剪辑开头有咔哒声/爆音 | 剪辑裁剪不当或解压问题 | 裁掉静音,在剪辑中使用淡入 |
| 移动设备上的 SFX 延迟 | 短 SFX 使用了 Streaming | 对小于 1s 的剪辑改用 Decompress On Load |
| 音频内存占用暴增 | 所有剪辑都使用了 Decompress On Load | 对音乐/环境音使用 Streaming,并进行压缩 |
| 交叉淡化生硬 | 没有过渡曲线 | 使用 Mathf.SmoothStep 或对数曲线 |
| AudioMixer.SetFloat 失败 | 参数未公开 | 在 Inspector 中右键点击参数 > Expose |
| 声音反复相同 | 没有音高/音量变化 | 使用 Audio Random Container 或手动随机化 |
评论
支持 Markdown