音频系统与 MetaSounds
Audio System & MetaSounds
UE5 的音频资产分三层:音源 (Sound Source) 负责产生声音,UE5 主推 MetaSounds,它是一张由设计师搭建的数字信号处理 (DSP) 图,能精确到单个采样;分组与混音用 Sound Class 和 Sound Class Mix 批量调整音量和音高;空间与资源由 Sound Attenuation(随距离衰减和空间化)和 Sound Concurrency(限制同时播放数量)控制。需要和节拍对齐的玩法可以用 Quartz 做精确到采样的调度。
MetaSounds:可编程的音源
官方定义:MetaSound 是一个高性能音频系统,让音频设计师完全掌控生成音源的 DSP 图。它和 Sound Cue 的根本区别在于:MetaSound 本质上是一张 DSP 渲染图,可以在运行时合成声音,并提供音频缓冲级别、精确到采样的时序和控制。每个 MetaSound 都是一个独立的音频渲染引擎,彼此并行渲染,采样率、缓冲大小、声道数都可以不同。(MetaSounds: The Next Generation Sound Sources in Unreal Engine)
精确到采样 (Sample-Accurate) 的含义,以官方举的 48 kHz 为例:
MetaSound 的触发器 (Trigger) 在图内执行精确到采样的事件,来源可以是游戏事件、节点或图本身;Wave Player 节点支持精确到采样的拼接;很多节点参数可以直接用音频缓冲调制,也就是「音频速率」调制。(MetaSounds: The Next Generation Sound Sources in Unreal Engine)
| 概念 | 说明(官方) |
|---|---|
| MetaSound Source | 能独立发声的资产 |
| MetaSound Patch | 图的操作方式与 Source 相同,但不能独立发声,供其他 MetaSound 引用复用 |
| Preset | 继承父图(只读),只覆盖输入的默认值;父图改动会同步到所有 Preset |
| 图的语义 | 蓝图是执行图,MetaSound 是数据流图 (Flow Graph) |
| 引脚类型 | Trigger(类似蓝图执行引脚)、Audio(真实音频缓冲)、Float/Int32/Bool/Time/String 等 |
新建的 MetaSound Source 默认启用 UE.Source.OneShot 接口,它会加入 On Finished 输出节点。如果 On Finished 永远不被触发,声音会无限播放;音乐、环境音这类无限时长的声音应在 Interfaces 面板中移除该接口。Trigger 由时序节点或游戏事件触发时精确到采样,但如果连接到非音频速率的节点,输出会退化为块速率 (block rate)。(MetaSounds Reference Guide in Unreal Engine)
Sound Class 与 Sound Class Mix
Sound Class 把多个声音分组,以便一次性调整参数:Volume、Pitch 是叠加在 Sound Wave 自身设置之上的乘数;Low Pass Filter Frequency 设置低通截止频率(20000 及以上等于不起作用);Always Play 可以防止该类声音被优先级更低的声音挤出语音池 (voice pool)。Sound Class 可以设置子类,子类设为 Inherited 时会继承父类的音高、音量和加载行为。被动混音修改器 (Passive Sound Mix Modifier) 在该类任一声音播放时自动生效,无需显式调用 Push Sound Mix Modifier;运行时也可以用 Sound Class Mix 动态调整参数。(Sound Classes in Unreal Engine)
下图是这几类资产在一次播放中的作用顺序(依据上面几份文档整理):
flowchart LR
A[MetaSound / Sound Wave / Sound Cue] --> B{"Sound Concurrency 是否允许播放"}
B -->|"拒绝或抢占"| X["不播放或停止旧声音"]
B -->|"允许"| C["Sound Class 音量/音高/低通乘数"]
C --> D["Sound Class Mix 运行时调整"]
D --> E["Sound Attenuation 距离衰减与空间化"]
E --> F["输出"]图中的先后关系只是概念上的分工:并发决定「能不能播」,Sound Class 和 Mix 决定「这一类整体多响」,衰减决定「在这个位置听起来如何」。引擎内部的实际执行顺序,文档没有给出。
Sound Attenuation:距离与空间化
衰减形状的内区是满音量,离开内区后音量逐渐减小,到外区边界降到最小;减小的速度由衰减函数决定。(Sound Attenuation in Unreal Engine)
| 衰减函数 | 特点与用途(官方) |
|---|---|
| Linear | 音量变化恒定,适合大型背景声的交叉淡化 |
| Logarithmic | 近处变化大、远处变化小 |
| Inverse | 与对数相似但更夸张,适合远处刚好听得到、靠近时明显变响的声音 |
| Natural Sound | 尝试模拟更接近现实的衰减,介于对数和反比之间 |
| 形状 | 典型用途 |
|---|---|
| Sphere(默认) | 大多数点声源 |
| Capsule | 水管这类沿长度分布的声音 |
| Box | 盒形区域 |
| Cone | 有方向性的声音,如广播喇叭 |
空间化 (Spatialization) 关闭时,声音变成 2D 声音,不做声像定位;空间化方法可以用内置插件,也可以在 Project Settings > Platforms > Audio > Spatialization Plugin 中换成第三方插件。Non-Spatialized Radius 让声音在听者靠近到一定距离内时逐渐过渡为非空间化,避免贴近大型声源时声像乱跳;3D Stereo Spread 控制立体声左右声道在世界中的间距。(Sound Attenuation in Unreal Engine)
Sound Concurrency:限制同时发声数
同时播放太多声音会消耗大量资源。Sound Concurrency 资产限制一组声音同时播放的数量,以及达到上限后怎么办;可以设为项目默认值,也可以在单个音源的 Concurrency Set 中指定多个(必须同时满足所有规则才能播放),或者用 Override Concurrency 单独覆盖。(Sound Concurrency Reference Guide)
| 属性 | 说明 |
|---|---|
| Max Count | 组内允许同时活跃的最大数量 |
| Limit to Owner | 每个播放该声音的 Actor 单独计数 |
| Resolution Rule | Prevent New / Stop Oldest / Stop Farthest Then Prevent New / Stop Farthest Then Oldest / Stop Lowest Priority / Stop Quietest / Stop Lowest Priority Then Prevent New |
| Retrigger Time | 两次播放之间的最小间隔;被它拒绝的声音不走虚拟化 |
常见的坑(官方):所有活跃的组件都计入 Max Count,不只是正在出声的;Source Bus 会占两个名额(原始音源一个、总线一个)。(Sound Concurrency Reference Guide)
Quartz:节拍对齐的精确调度
5.8 API 中,UQuartzSubsystem 提供 CreateNewClock(按名字创建时钟)、GetHandleForClock,以及 GetAudioRenderThreadToGameThreadMinLatency、GetRoundTripMinLatency 等查询游戏线程与音频渲染线程之间延迟的函数。(UQuartzSubsystem)它要解决的问题是:游戏线程下达播放命令到音频线程真正渲染之间有延迟,因此要提前调度,让声音落在精确的采样位置上。5.8 的《Quartz Quick Start》把 Quartz 定义为一个暴露给蓝图的调度系统,解决游戏线程、音频逻辑和音频渲染线程之间的时序问题,实现精确到采样的播放。官方示例(节拍器)的步骤(Quartz Quick Start):
Get QuartzSubsystem→Create New Clock(Clock Name 设为 LevelClock,用Make QuartzClockSettings/Make QuartzTimeSignature设置拍号)。- 把返回的 Clock Handle 提升为变量保存,官方说明这是为了防止它被垃圾回收。
Set Beats Per Minute(示例为 100),再Start Clock。Subscribe to All Quantization Events,在事件里对EQuartzCommandQuantization做 Switch:Bar(小节)时用一个Make QuartzQuantizationBoundary调用Play Quantized播放高音,Beat(拍)时播放低音。
flowchart LR S[QuartzSubsystem] -->|Create New Clock| H["Clock Handle 变量 防 GC"] H -->|Set BPM / Start Clock| C["音频渲染线程上的时钟"] C -->|"量化事件 Bar/Beat"| E["蓝图事件"] E -->|"Play Quantized + 量化边界"| A["Audio Component 在精确采样处发声"]
图中左半部分在游戏线程上执行,时钟本身运行在音频渲染线程上,Play Quantized 把播放命令排进时钟,在下一个量化边界的精确采样处执行。以 100 BPM 为例,一拍的长度是 秒,在 48 kHz 下是 个采样(这是算例)。
取舍
- 需要程序化、参数驱动、精确时序的声音用 MetaSound;简单的随机播放用 Sound Cue 也可以(这是归纳)。
- MetaSound Source 默认是 OneShot;循环声忘了移除这个接口或从不触发 On Finished,都会导致声音行为异常。
- 并发上限按「活跃组件」计数,大量挂着但不出声的 Audio Component 也会占名额。
GEA 的视角:通用音频引擎概念与 UE5 资产的对应(卷 II 15.4–15.6)
GEA 第 15 章用不依赖具体引擎的术语描述音频引擎,可以和本页的 UE5 资产对照(对应关系是对比归纳,UE5 侧的说法来自本页引用的官方文档):
| GEA 概念 | 本页中的 UE5 对应 | 说明 |
|---|---|---|
| 音效提示 (sound cue):片段 + 播放元数据,程序只按事件播放(卷 II 15.5.7.2) | Sound Cue、MetaSound Source | GEA 提到 Scream 的 cue 可以带任意脚本;MetaSound 更进一步,本身就是一张可在运行时合成的 DSP 图 |
| 分组 (group)、预主混、混音快照(卷 II 15.5.8.1、15.5.8.3) | Sound Class、Sound Class Mix、被动混音修改器 | 两边都用"分类 + 单值控制整类"实现;GEA 的闪避 (ducking) 可以由某类声音出现时自动触发,与 Passive Sound Mix Modifier"该类声音播放时自动生效"是同一思路 |
| FO min / FO max 与衰减曲线(卷 II 15.4.3) | Sound Attenuation 的内区/外区与衰减函数 | GEA 认为物理正确的增益衰减是 ,并主张按游戏需要定制曲线;UE5 的 Natural Sound 函数是官方给出的"更接近现实"的选项 |
| 聚焦角:声源靠近或进入扬声器圆时铺开到多只扬声器(卷 II 15.4.4.5) | Non-Spatialized Radius | 都是为了避免贴近声源时声像乱跳;GEA 的做法是加宽声像,UE5 文档的做法是逐渐过渡为非空间化 |
| 实例限制、按组限制、优先级与语音抢占(卷 II 15.5.8.4) | Sound Concurrency(Max Count、Resolution Rule)、Sound Class 的 Always Play | Resolution Rule 中的 Stop Farthest、Stop Lowest Priority、Stop Quietest 对应 GEA 列举的按距离(FO max)、按优先级抢占;Always Play 对应 GEA 的"不可抢占"标记 |
| 总线延迟、游戏线程与音频线程之间的缓冲(卷 II 15.5.6.3) | Quartz 的延迟查询与量化调度 | GEA 讲缓冲大小带来的延迟;Quartz 通过提前调度到量化边界,把这段延迟变得可预测 |
| 动态音乐、插入乐与过渡时机(卷 II 15.6.3) | Quartz 的 Bar/Beat 量化事件 | GEA 指出音乐过渡难在节拍对齐;Quartz 可以把切换放到小节或拍的边界上 |
细节见 音频引擎架构、三维音频渲染 和 游戏音频功能与角色对话。
分歧:GEA 的概览只说"Unreal Engine 提供自己的 3D 音频引擎和集成工具链"(卷 II 15.5.9.4),没有介绍 MetaSounds、Quartz 等具体系统;本页内容以 UE 5.8 官方文档为准。
出处
- MetaSounds: The Next Generation Sound Sources in Unreal Engine UE 5.8 文档
- MetaSounds Reference Guide in Unreal Engine UE 5.8 文档
- Sound Classes in Unreal Engine UE 5.8 文档
- Sound Attenuation in Unreal Engine UE 5.8 文档
- Sound Concurrency Reference Guide UE 5.8 文档
- UQuartzSubsystem UE 5.8 API 参考
- Quartz Quick Start UE 5.8 文档
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 15 章 15.4–15.6 节