はじめに
2Dゲーム開発において、効果音やBGMを「ゲーム空間上の位置」から再生したいことがあります。例えば、敵の爆発音は敵の位置から、キャラクターの足音は歩いている位置から聞こえるべきですよね。このような「空間的な音響効果」を実現するのが AudioStreamPlayer2D です。
この記事では、AudioStreamPlayer2Dの基本的な使い方から、距離に応じた音量変化、バス制御まで、実践的なテクニックを解説します。
AudioStreamPlayer2Dとは?
AudioStreamPlayer2D は、2D空間上の特定の位置から音を再生するノードです。プレイヤーキャラクターとの距離に応じて自動的に音量が変化し、パンニング(左右の音量バランス)も調整されます。
例えるなら、リアルな映画館の音響。舞台の右側で音がしたら、右スピーカーから大きく、左スピーカーから小さく聞こえる—それが AudioStreamPlayer2D です。
継承ツリー:
AudioStreamPlayer2D → Node2D → Node → Object
このノードを使うべき場面
使うべき場面
- 効果音の空間配置:足音、ジャンプ音、着地音など、キャラクターの動作音
- 環境音の表現:風の音、水音、機械音など、シーンに立体感を与える音
- 敵や障害物の音:敵の攻撃音、爆発、罠の音など
- NPC会話音:複数のNPCがいる場面で、話者の位置から音を出す
- パーティクルシステムと組み合わせた演出:爆発エフェクトと同時に爆発音を再生
使わない場面
- BGM再生:背景音楽は位置に関係なく常に同じ音量で聞こえるべき(AudioStreamPlayer を使用)
- UI音(決定音、キャンセル音):画面上の固定位置の音(AudioStreamPlayer を使用)
主なプロパティと機能
| プロパティ | 型 | 説明 |
|---|---|---|
stream |
AudioStream | 再生するオーディオファイル(.ogg, .mp3, .wavなど) |
playing |
bool | 現在再生中かどうか |
volume_db |
float | 基本音量(デシベル単位。0dB=元の音量、-80dB=ほぼ無音) |
pitch_scale |
float | 再生速度・ピッチ(1.0=標準、2.0=2倍速で高音、0.5=半速で低音) |
max_distance |
float | この距離以上離れると音が聞こえなくなる |
attenuation |
float | 距離による減衰の強さ(値が大きいほど遠いと急激に小さくなる) |
bus |
StringName | 出力先オーディオバス(”Master”や”SFX”など) |
area_mask |
int | どのエリアマスクのリスナーに聞こえるか制御 |
基本的な使用例1:効果音の再生
extends Node2D
@onready var footstep_sound = $AudioStreamPlayer2D
func _ready():
# 足音を最大10メートル離れたら聞こえなくなるように設定
footstep_sound.max_distance = 1000.0 # ゲーム単位
footstep_sound.attenuation = 1.0
func play_footstep():
# キャラクターが足音を出す
footstep_sound.play()
func _process(delta):
# ノードの位置が自動的にリスナーに対する距離計算に使われる
pass
動的な音量調整例2:敵の攻撃音で距離反映
extends AudioStreamPlayer2D
func play_attack_sound():
volume_db = 0 # 基本音量に設定
play()
# リスナー(プレイヤー)との距離を手動で計算する場合
func _process(delta):
var listener_pos = get_tree().get_first_child_in_group("player").global_position
var distance = global_position.distance_to(listener_pos)
# 距離に応じたカスタム音量制御
if distance > max_distance:
stop()
else:
var volume_ratio = 1.0 - (distance / max_distance)
volume_db = linear2db(volume_ratio)

もっと使いこなす:カスタマイズできるパラメータ
| パラメータ | 推奨値の範囲 | 用途・解説 |
|---|---|---|
max_distance |
500 ~ 5000 | 音が聞こえなくなる距離。屋外は大きく、室内は小さく |
attenuation |
1.0 ~ 3.0 | 1.0=穏やか、3.0=急激。リアリズムなら2.0付近 |
volume_db |
-80 ~ 0 | -80dB近くで無音、0dBで元の音量。±6dBでおよそ2倍/半分 |
pitch_scale |
0.8 ~ 1.5 | ランダムに設定してバリエーション(1.0±0.1など) |
pan |
-1.0 ~ 1.0 | 左(-1)~ 中央(0)~ 右(1)。自動パンニングなら触らない |

まとめ
AudioStreamPlayer2D は、ゲームの音響表現に「奥行き感」をもたらす重要なノードです。適切な max_distance と attenuation を設定すれば、プレイヤーは自然な音空間を体験できます。
- 位置ベースの音:足音、爆発音、敵の声など、ゲーム空間内の現象を音で表現
- 距離減衰の自動化:max_distance と attenuation で物理的なリアリティを実現
- オーディオバスとの連携:bus プロパティで全体的な音量制御が可能
次回は「GPUParticles2D」をお届けします。爆発、炎、雨などの美しいエフェクトをGPUの力で高速処理する方法を解説します!
シリーズ:Godot 4 ノード解説
- 001: Node2D
- 002: Sprite2D
- 003: CollisionShape2D
- 004: CharacterBody2D
- 005: RigidBody2D
- 006: Area2D
- 007: Control
- 008: Button
- 009: Label
- 010: TextEdit
- 011: ItemList
- 012: TabContainer
- 013: Timer
- 014: Tween
- 015: Camera2D
- 016: ParallaxBackground
- 017: TileMap(旧)
- 018: Path2D
- 019: PathFollow2D
- 020: RemoteTransform2D
- 021: Marker2D
- 022: Node
- 023: Resource
- 024: Script
- 025: Signal
- 026: Input
- 027: Physics2DServer
- 028: VisibleOnScreenNotifier2D
- 029: RayCast2D
- 030: ShapeCast2D
- 031: PinJoint2D
- 032: DistanceJoint2D
- 033: HingeJoint2D
- 034: SliderJoint2D
- 035: ConeTwistJoint2D
- 036: Generic6DOFJoint2D
- 037: Polygon2D
- 038: ColorRect
- 039: NinePatchRect
- 040: TextureRect
- 041: StaticBody2D
- 042: TileMapLayer
- 043: AnimationPlayer
- 044: AnimationTree
- 045: AudioStreamPlayer
- 046: AudioStreamPlayer2D
- 047: GPUParticles2D
- 048: CPUParticles2D
- 049: Line2D
- 050: CanvasLayer
この記事はGodot 4.xをもとに執筆しています。


コメント