load("res://coin.wav") 写死在脚本里,换文件就要改代码。节点上放 AudioStreamPlayer,在检查器指定 stream。
金币音
金币场景里加 AudioStreamPlayer。queue_free 会砍掉正在播的声音,所以先把播放器挪到场景树外面,或延迟删除:
gdscript
func _on_body_entered(body: Node2D) -> void:
if not body.is_in_group("player"):
return
var p := $AudioStreamPlayer
p.reparent(get_tree().current_scene)
p.finished.connect(p.queue_free)
p.play()
queue_free()背景音乐
Autoload 一个 Bgm:
gdscript
extends Node
@onready var player := $AudioStreamPlayer
func play(stream: AudioStream) -> void:
if player.stream == stream and player.playing:
return
player.stream = stream
player.play()切场景时音乐不断。同一首不要每进一关从头播,先判断 stream 是不是同一个。
总线
音频 → 总线,加 SFX / BGM。播放器的 Bus 选对应名字。之后做静音只要拉总线音量,不用改每个节点。
WAV 做短音效,OGG 做长 BGM。导入时音效勾 2D 或 3D 没有关系,2D 小游戏用普通 AudioStreamPlayer 即可,不必上 AudioStreamPlayer2D,除非你要按距离衰减。
