はじめに
ゲームの世界観を完成させるには、視覚的な表現と同じくらい、音響表現が重要です。では、爆発音がゲーム空間の特定の位置から聞こえるとき、近ければ大きく、遠ければ小さく聞こえる——そんな現実的な音響体験をどのように実装するのでしょうか?その答えがAudioStreamPlayer2Dです。
このノードを使うことで、ゲーム空間内に「位置を持つ音源」を配置し、プレイヤーとの距離に応じた自然な音量減衰を実現できます。
AudioStreamPlayer2Dとは?
AudioStreamPlayer2Dは「ゲーム空間内の位置を持つスピーカー」のようなノードです。音源がゲームワールド内の位置を持つため、カメラ(やAudioListener2D)との距離に応じて音量が変わります。近づくほど大きく聞こえ、遠ざかるほど小さくなるのです。
継承ツリー:
AudioStreamPlayer2D → Node2D → CanvasItem → Node
Node2Dを継承しているため、global_positionプロパティで3D空間内の位置を持ちます。AudioStreamPlayer(非位置依存)とは異なり、spatial audioのコンセプトに基づいて設計されています。

このノードを使うべき場面
爆発音(発生位置から距離で減衰)
爆発が画面中央で起きるときは大きく、画面外で起きるときは小さく聞こえます。これはゲーム空間の現実感を大きく高めます。
NPC・モンスターの足音
敵が近づいてくるにつれて、足音が大きくなり、遠ざかると小さくなります。プレイヤーは足音の大きさから敵の距離を無意識のうちに判断できます。
川・噴水の環境音
世界に存在する環境音(アンビエント)の位置を明確にすることで、ゲーム世界がより立体的に感じられます。
プレイヤー周辺の音響空間
複数のAudioStreamPlayer2Dを配置することで、ゲーム空間全体が豊かな音響環境になります。鳥の声、風音、遠い音楽など、層状に重ねることで没入感が生まれます。
別のノードが適切な場面
AudioStreamPlayer(非位置依存)は、BGMやUIサウンドなど、位置を持たない音に使用します。3D空間の音源はAudioStreamPlayer3Dを使用してください。
主なプロパティと機能
| プロパティ名 | 型 | 説明 | デフォルト値 |
|---|---|---|---|
stream |
AudioStream | 再生するオーディオファイル。.ogg, .mp3, .wavなどに対応 | null |
volume_db |
float | 音量をデシベルで指定。0=通常、-80=無音に近い。距離減衰の基準値 | 0.0 |
pitch_scale |
float | 音の高さの倍率。1.0=通常、2.0=2倍、0.5=半速・低い | 1.0 |
max_distance |
float | この距離を超えると音が聞こえなくなる(0で無制限) | 0.0 |
attenuation |
float | 距離減衰の強さ。1.0=線形、2.0=より急峻に減衰 | 1.0 |
bus |
StringName | 出力先オーディオバス。”Master”など。複数音源のミックス制御に有効 | “Master” |
play(from_position) |
method | 音の再生を開始。from_positionで再生開始位置を秒単位で指定可能 | – |
stop() |
method | 音の再生を停止 | – |
is_playing() |
method | 現在再生中かどうかをboolで返す | – |
finished |
signal | 再生が終了したときに発火。次の処理をトリガーするのに有効 | – |
GDScriptコード例1:敵の足音を距離で制御
extends CharacterBody2D
@onready var audio_player = $AudioStreamPlayer2D
@onready var camera = get_node("/root/Main/Camera2D")
var speed = 150.0
var is_walking = false
var footstep_interval = 0.4 # 0.4秒ごとに足音
var footstep_timer = 0.0
func _ready():
# 足音ファイルを設定
audio_player.stream = preload("res://assets/sounds/footstep.ogg")
audio_player.volume_db = 0.0 # 基準音量
audio_player.max_distance = 800.0 # 800px以上離れたら聞こえない
audio_player.attenuation = 1.5 # 距離減衰を少し強めに
func _physics_process(delta):
# キャラクター移動
var input_vector = Vector2.ZERO
if Input.is_action_pressed("ui_right"):
input_vector.x += 1
if Input.is_action_pressed("ui_left"):
input_vector.x -= 1
if Input.is_action_pressed("ui_down"):
input_vector.y += 1
if Input.is_action_pressed("ui_up"):
input_vector.y -= 1
input_vector = input_vector.normalized()
# 移動している場合のみ足音を再生
if input_vector != Vector2.ZERO:
velocity = input_vector * speed
is_walking = true
footstep_timer -= delta
if footstep_timer <= 0.0:
if not audio_player.is_playing():
audio_player.play()
footstep_timer = footstep_interval
else:
velocity = Vector2.ZERO
is_walking = false
if audio_player.is_playing():
audio_player.stop()
move_and_slide()
# AudioStreamPlayer2Dの位置をキャラクターに同期
audio_player.global_position = global_position
GDScriptコード例2:複数のAudioStreamPlayer2Dで環境音を構築
extends Node2D
@onready var camera = $Camera2D
@onready var player = $Player
# 環境音源(水、鳥、風など)
var ambient_sounds = []
func _ready():
# 環境音源を配列に格納
ambient_sounds = [
{"node": $Water, "name": "川の音"},
{"node": $Birds, "name": "鳥の声"},
{"node": $Wind, "name": "風音"},
]
# 各環境音をセットアップ
for sound in ambient_sounds:
var audio_node = sound["node"]
audio_node.volume_db = -5.0 # 環境音は少し小さめ
audio_node.max_distance = 1500.0 # 遠い音源
audio_node.attenuation = 0.8 # 減衰を弱く(遠くまで聞こえる)
audio_node.bus = "Ambient" # 環境音専用バス
# ループ再生を有効にする場合
if audio_node.stream.get_length() > 0:
# AudioStreamLooped を使用するか、または自動ループ設定
pass
# 最初はすべて再生
for sound in ambient_sounds:
sound["node"].play()
# カメラ設定
camera.follow_smoothing_enabled = true
camera.follow_smoothing_speed = 5.0
func _process(delta):
# カメラをプレイヤーに追従
camera.global_position = player.global_position
# 環境音の音量をリアルタイムで調整
for sound in ambient_sounds:
var audio_node = sound["node"]
var distance = player.global_position.distance_to(audio_node.global_position)
# 距離に応じた音量調整(オプション:自動減衰に加えて手動調整)
if distance > audio_node.max_distance:
audio_node.volume_db = -80.0 # ほぼ無音
else:
audio_node.volume_db = -5.0

もっと使いこなす:カスタマイズできるパラメータ
| カスタマイズ項目 | 設定方法 | 効果 |
|---|---|---|
| 複数のオーディオバスの管理 | audio_player.bus = "SFX" # SFXバスに割り当て |
オーディオバスを使用して、複数の音源をグループ化し、マスター音量や効果を一括制御 |
| pitch_scaleで音の高さを動的に変更 | audio_player.pitch_scale = randf_range(0.8, 1.2) |
同じ足音でも毎回微妙に異なる高さで再生し、不自然さを軽減 |
| マックス距離の動的調整 | audio_player.max_distance = 1000.0 |
ゲームの状況(屋外vs屋内など)に応じて、音の聞こえる範囲を動的に変更 |
| AudioListener2Dでカスタムリスナーを設定 | var listener = AudioListener2D.new() |
通常はCamera2Dに基づいて減衰が計算されるが、カスタムリスナーを使用することで、より柔軟な音響空間を設計 |
| finishedシグナルで連続再生を制御 | audio_player.finished.connect(_on_audio_finished)
|
ループ機能がないAudioStreamに対して、finishedシグナルで自動ループを実装 |
まとめ
AudioStreamPlayer2Dは、ゲーム空間に「音響的な立体性」をもたらすノードです。視覚的な表現と同じくらい重要な、音響表現をリアルに実装できます。敵の足音で距離を認識させたり、環境音で世界観を構築したり、爆発音で事象の衝撃を伝えたり——これらすべてが、AudioStreamPlayer2Dを使いこなすことで可能になるのです。このシリーズは今後も続きます。Godot 4の他の重要なノードについても、今後解説していく予定です。
- AudioStreamPlayer2Dは、ゲーム空間内の位置を持つ音源を表現するノード
- max_distanceとattenuationで、距離に応じた自然な音量減衰を実現
- 複数のAudioStreamPlayer2Dを組み合わせることで、豊かな音響環境を構築可能
これまで096~100の5つのノードを詳しく解説してきました。DirectionalLight2D、LightOccluder2D、ParallaxBackground、ParallaxLayer、AudioStreamPlayer2D——これらのノードをマスターすることで、2Dゲーム開発の幅が大きく広がります。今後のシリーズでも、さらに多くの有用なノードを紹介していく予定です。
シリーズ:Godot 4 ノード解説
このシリーズは、Godot 4でよく使用されるノードの使い方を詳しく解説しています。
- 001〜095: 各種ノード
- 096: DirectionalLight2D
- 097: LightOccluder2D
- 098: ParallexBackground
- 099: ParallexLayer
- 100: AudioStreamPlayer2D(このページ)
この記事はGodot 4.xをもとに執筆しています。


コメント