mcpField
U
Unity Audio

Unity Audio

github.com/juliankerignard开发852 次安装31 周前更新
代码仓库

关于 Unity Audio

面向使用 Unity 6+ 构建游戏音频系统的开发者,指导音频功能的设计与实现。内容涵盖对象池音效、音乐转场、3D 空间音频、混音器和性能分析,并采用 ScriptableObjects 与事件驱动模式。

主要功能

  1. 01构建音效对象池系统
  2. 02在音乐曲目间交叉淡化
  3. 03设置 3D 音频与环境声
  4. 04配置 AudioMixer 快照
  5. 05使用 Audio Random Containers
  6. 06分析音频声部与内存

适用场景

  1. 01为 Unity 游戏添加可复用音效
  2. 02在场景或状态间切换音乐
  3. 03通过触发区域设置空间环境声
  4. 04排查音频声部与内存问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/juliankerignard/unity-skills --skill unity-audio

安装后在 Claude Code 中输入/unity-audio确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
audio-patterns.md
audio-advanced.md
audio-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 模式)

快速开始

  1. 描述需求:声音类型(SFX、音乐、环境音)、使用场景(2D/3D/VR)
  2. 遵循决策树,选择合适的模式
  3. 创建基于 ScriptableObject 的 AudioManager 和 SoundEmitter 对象池
  4. 配置导入设置,匹配音频类型(参见 references/audio-optimization.md)
  5. 测试,使用 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:事件通道,用于解耦播放请求
  • AudioManager MonoBehaviour:监听通道并管理 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