- 文档
- 教程
- 游戏开发
【免费下载链接】godot-docs
Godot Engine official documentation
AudioStreamPlayer2D 是 Godot 引擎中用于在 2D 空间中播放位置化音频(positional audio)的核心节点:声音会随距离衰减、随相对位置左右声像偏移,让游戏世界中的脚步声、环境音、特效音拥有真实的空间感。本文基于仓库中的 AudioStreamPlayer2D 类参考,结合 AudioListener2D、Area2D、AudioServer 等关联文档与 音频流教程 的实战章节,完整讲解从节点配置、核心参数、听力点控制到"水下音效"式区域总线分流的全流程,读完即可在项目中落地一套可用的 2D 空间音频方案。
AudioStreamPlayer2D 是什么:2D 空间中的"声源"
AudioStreamPlayer2D 继承自Node2D < CanvasItem < Node < Object(见 类继承声明),这意味着它是一个普通的 2D 节点,可以直接放置在场景树中并随场景移动。它的职责是:播放随与听者(listener)之间距离而衰减的音频。
与不带位置概念的 AudioStreamPlayer 相比,AudioStreamPlayer2D 的行为差异正如 音频流教程 所描述:
- 靠近屏幕左侧时,声像(panning)向左偏移;
- 靠近屏幕右侧时,声像向右偏移;
- 离声源越远,音量越小,直至超过
max_distance后完全听不见。
默认听力点:默认情况下,声音从屏幕中心"被听到"。如果需要改变听力的位置(例如跟随玩家角色),必须在场景中添加一个 AudioListener2D 节点并通过make_current()激活它——这一点在本文"听力点控制"小节会详细展开。
快速上手:三步搭建一个 2D 声源
在 Godot 编辑器中按以下步骤即可完成最小可用的位置音频:
- 在场景中新建
AudioStreamPlayer2D节点; - 在 Inspector 的
Stream属性中拖入一个音频资源(如 WAV、OGG Vorbis、MP3 等AudioStream); - 将节点移动到声源应处的位置,运行时即可听到随距离/方位变化的声音。
若希望节点一进入场景树就自动播放,勾选 Inspector 中的Autoplay属性(对应源码属性 autoplay,默认false:仅在"添加到场景树时"触发一次播放,适合门铃、开关、刷怪等一次性音效)。
用代码控制播放
# 播放整个音频流(等价于编辑器里点 Play) $AudioStreamPlayer2D.play() # 从第 2.5 秒处开始播放 $AudioStreamPlayer2D.play(2.5) # 停止播放 $AudioStreamPlayer2D.stop() # 播放中跳转到第 10 秒 $AudioStreamPlayer2D.seek(10.0) # 查询当前播放位置(秒) var pos: float = $AudioStreamPlayer2D.get_playback_position() # 暂停 / 恢复 $AudioStreamPlayer2D.stream_paused = true $AudioStreamPlayer2D.stream_paused = false注意 play() 并非立即出声:它会把音频"排队",在下一个物理帧才真正开始播放,且from_position参数以秒为单位指定起始位置。seek(to_position)则立即设置即将播放的位置。播放结束时节点会发出finished信号,可用于实现循环播放或衔接下一段音效:
func _ready() -> void: $AudioStreamPlayer2D.finished.connect(_on_finished) func _on_finished() -> void: $AudioStreamPlayer2D.play() # 无缝循环核心属性全景表
以下是 AudioStreamPlayer2D 的全部属性、类型与默认值(数据源自 属性总表):
| 属性 | 类型 | 默认值 | 一句话作用 |
|---|---|---|---|
stream | AudioStream | — | 要播放的音频流资源 |
volume_db | float | 0.0 | 衰减前的基础音量(分贝) |
volume_linear | float | — | 基础音量的线性形式(便捷读写) |
pitch_scale | float | 1.0 | 音高/速度倍率 |
bus | StringName | &"Master" | 输出到的音频总线 |
playing | bool | false | 是否正在播放/已排队播放 |
autoplay | bool | false | 进入场景树时自动播放 |
stream_paused | bool | false | 暂停/恢复播放 |
max_distance | float | 2000.0 | 可听到声音的最大距离 |
attenuation | float | 1.0 | 距离衰减指数 |
panning_strength | float | 1.0 | 声像强度的逐节点倍率 |
area_mask | int | 0 | 哪些 Area2D 层影响该声源 |
max_polyphony | int | 1 | 同节点同时播放的最大声音数 |
playback_type | PlaybackType | 0(默认) | 强制流的回放类型(实验性) |
stream:确定播放内容
stream属性接收任意 AudioStream 资源(如 AudioStreamWAV、AudioStreamOggVorbis、AudioStreamMP3)。切换到新流后,需重新调用play()才会开始播放新内容。
volume_db 与 volume_linear:衰减前的基准音量
volume_db(默认0.0)是距离衰减生效之前的基准音量,单位分贝;volume_linear是同一基准音量的线性表示,两者互为便捷别名:读取volume_linear等价于对volume_db执行db_to_linear(),写入等价于对其执行linear_to_db()(见 volume_linear 说明)。按个人习惯选用其一即可,二者始终同步。
pitch_scale:音高与速度倍率
pitch_scale(默认1.0)以音频采样率为基准成倍改变音高与播放速度:设为0.5声音低沉且变慢,设为2.0则尖锐且变快。常用于实现脚步声随机化、子弹掠过音、变速变调等效果。
bus:音频路由到指定总线
bus(默认&"Master")决定音频进入哪条音频总线,从而让混音器中的均衡器、压缩、混响等 音频效果 生效。有两个关键行为需要注意(见 bus 属性说明):
- 设置时不做存在性校验,因为总线布局可能在本属性设置之后才加载;
- 若运行时该名字无法解析,会静默回退到
"Master"总线,不会报错。
因此建议通过 AudioServer.get_bus_index() 校验总线名,或始终使用项目已确定存在的总线名。
playing / stream_paused:播放状态管理
playing为true表示音频正在播放,或已被play()排队等待物理帧播放;stream_paused为true时暂停播放,置回false即恢复,适合游戏暂停菜单、过场动画等场景。
max_distance 与 attenuation:距离衰减的两把旋钮
max_distance(默认2000.0):声音可被听到的最大距离(2D 世界单位)。声源与听者距离超过该值后音量降到不可闻;attenuation(默认1.0):音量随距离衰减时使用的指数。数值越大,衰减越剧烈;设为0.0则基本不随距离衰减。
两者共同决定"多大声、多远、多快变轻",是 2D 空间音频听感的核心。声音源点在场景中的实际position就是计算衰减与声像的基准位置。
panning_strength:逐节点声像倍率
panning_strength(默认1.0)将项目级设置ProjectSettings.audio/general/2d_panning_strength(默认0.5)作为基数相乘,得到该节点最终的声像强度,见 panning_strength 说明。数值越高,左右声道偏移越夸张。项目级基数的含义(ProjectSettings 文档):
0.0:完全禁用立体声声像,只保留音量衰减;1.0:声源恰好位于听者正左/正右时,对侧声道完全静音;- 默认
0.5针对耳机调校;用音箱播放时,因为音箱立体声分离度低于耳机,可尝试调低该值获得更好听感。
area_mask:决定哪些区域影响声源
area_mask(默认0,即不启用任何区域)是一个位掩码,决定哪些 Area2D 图层会影响该声源,用于混响与总线效果分流。典型场景:为水面做一个"水下区域",当声源进入该区域时把声音重定向到经过特殊处理的总线,让声音听起来像在水下播放。具体配置见下文"用 Area2D 做区域音频分流"。
max_polyphony:同节点复音数
max_polyphony(默认1)限制同一个 AudioStreamPlayer2D 节点同时发出的声音数量。达到上限后再触发新声音,会掐掉最旧的声音。典型用途:在单个节点上叠加多把武器开火、多颗炮弹爆炸,避免每发子弹都新建节点,同时防止音量爆发。
playback_type:实验性的回放类型强制
playback_type(默认0)对应 AudioServer.PlaybackType 枚举:
PLAYBACK_TYPE_DEFAULT(0):遵循项目设置audio/general/default_playback_type声明的平台默认类型;PLAYBACK_TYPE_STREAM(1):强制按"流"方式回放,灵活但延迟较高;PLAYBACK_TYPE_SAMPLE(2):强制按"采样"方式回放,延迟更低、播放更稳定,但灵活性低,且不支持 AudioEffect;PLAYBACK_TYPE_MAX(3):仅表示枚举大小。
注意:该属性与对应枚举均被标注为Experimental(实验性),未来版本可能变更或移除;且PLAYBACK_TYPE_SAMPLE目前仅受 Web 平台支持(Web 默认即以采样方式回放以避免单线程导出下音频失真,见 音频流教程 与项目设置audio/general/default_playback_type.web)。桌面平台无需改动此属性,保持默认即可。
听力点控制:用 AudioListener2D 决定"从哪听"
默认情况下,AudioStreamPlayer2D 的声音从屏幕中心被听到(见 类描述)。想让听觉位置跟随角色或摄像机,需要 AudioListener2D:
- 在场景中加入
AudioListener2D节点并调用make_current()激活它,听力点即变为该节点的位置; - 同一时刻只有一个AudioListener2D 生效:新节点
make_current()会自动禁用之前的当前监听器; - 若场景中没有任何激活的 AudioListener2D,听力点回到屏幕中心;
- AudioListener2D 必须位于场景树(SceneTree)中才会生效;
clear_current()可手动取消其当前状态,is_current()可查询状态。
# 让玩家身上的监听器成为听力点(例如第三人称跟随视角) func _ready() -> void: $Player/AudioListener2D.make_current()把 AudioListener2D 挂在玩家角色(或跟随玩家的 Camera2D)下,即可实现"玩家移动时,远处的声源越来越轻、方位感随视角变化"的完整空间音频体验。
进阶实战:用 Area2D 做区域音频分流(水下音效示例)
AudioStreamPlayer2D 的area_mask与 Area2D 的音频总线覆盖机制配合,可以实现"按游戏区域路由音频总线"的空间化混音,这正是 音频流教程 中强调的典型用法:让同一区域内的声音进入带不同混响/音质处理的总线。
实现步骤:
- 在 Audio Bus 面板新建一条总线(如
Underwater),为其添加混响/低通等 音频效果; - 在场景中放置一个覆盖"水面区域"的
Area2D,将其 audio_bus_override 设为true,并把 audio_bus_name 指向Underwater总线; - 将该 Area2D 放入一个 Layer(例如 Layer 3),把 AudioStreamPlayer2D 的
area_mask设为对应位(如1 << 3,即值8); - 当声源与听者处于该区域内时,其声音会被 Area2D 重定向到
Underwater总线,播放出"在水下"的滤波/混响效果。
area_mask的位掩码语义与 Godot 的碰撞层/区域层一致:0表示不参与任何区域分流,多个区域可通过对位值取或(|)组合。注意 3D 侧的Area3D还提供reverb_bus_enabled、reverb_bus_amount等更细粒度的混响控制(见 Area3D 文档),2D 侧则以总线覆盖为主要的区域分流手段。
实用技巧与注意事项
以下是使用 AudioStreamPlayer2D 时必须知晓的边界行为(均出自 类参考 与属性说明):
- 隐藏节点 ≠ 静音:将 AudioStreamPlayer2D 节点
hide()(隐藏)不会关闭其音频输出。需要临时静音时,把volume_db设为极低值(如-100,低于人耳听阈),而不是隐藏节点; bus设置不校验:总线名拼错不会报错,运行时静默回退到"Master";play()有延迟:声音在下一个物理帧才开始,需要精确起播时刻时应提前调用或结合seek()使用;finished信号:音频播放停止时发出,是循环播放、顺序衔接音频的自然挂点;get_stream_playback()/has_stream_playback():可获取底层 AudioStreamPlayback 对象以访问当前回放状态(如缓冲、谱分析数据),has_stream_playback()先用于判断是否能取得该对象(见 方法说明);- 实验性属性:
playback_type及 AudioServer 的PlaybackType枚举均标注 Experimental,请勿在正式版本中依赖其长期稳定性。
小结
AudioStreamPlayer2D 通过max_distance+attenuation控制距离衰减,通过panning_strength与项目级audio/general/2d_panning_strength控制左右声像,通过 AudioListener2D 决定听力点,通过area_mask+ Area2D 的audio_bus_override实现按区域的总线分流——四套机制组合起来,即可构建出接近真实听觉的 2D 空间音频系统。需要更深入的混音总线知识,可继续阅读仓库中的 音频总线教程 与 音频效果教程;若项目是 3D 场景,则对应参考 AudioStreamPlayer3D(其支持立体声、5.1、7.1 环绕布局,见 音频流教程)。
- 文档
- 教程
- 游戏开发
【免费下载链接】godot-docs
Godot Engine official documentation
相关推荐
从"找教材"到"用教材":如何用智能工具一键获取所有中小学电子课本?
从"找教材"到"用教材":如何用智能工具一键获取所有中小学电子课本? 还在为寻找电子教材而烦恼吗?每次备课、学习都要在各种教育平台间反复跳转,下载过程繁琐,文件
网页爬虫教育老旧Mac升级macOS完整教程:免费让2012年的MacBook Pro流畅跑上最新系统
老旧Mac升级macOS完整教程:免费让2012年的MacBook Pro流畅跑上最新系统 去年冬天,帮表姐修电脑时,我从她抽屉深处翻出一台2012年的MacB
操作系统固件驱动开发Semantica 距离智能(Distance Intelligence)实战指南:距离带、置信度衰减与多算法路径分析
Semantica 距离智能(Distance Intelligence)实战指南:距离带、置信度衰减与多算法路径分析 本篇指南围绕 Semantica 的 C
人工智能大模型知识图谱RAGAI 可解释性后端MCP 服务
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考