Godot入門:AudioStreamPlayer2Dの使い方と活用法





Godot入門:AudioStreamPlayer2Dの使い方と活用法

はじめに

ゲームの世界観を完成させるには、視覚的な表現と同じくらい、音響表現が重要です。では、爆発音がゲーム空間の特定の位置から聞こえるとき、近ければ大きく、遠ければ小さく聞こえる——そんな現実的な音響体験をどのように実装するのでしょうか?その答えがAudioStreamPlayer2Dです。

このノードを使うことで、ゲーム空間内に「位置を持つ音源」を配置し、プレイヤーとの距離に応じた自然な音量減衰を実現できます。

AudioStreamPlayer2Dとは?

AudioStreamPlayer2Dは「ゲーム空間内の位置を持つスピーカー」のようなノードです。音源がゲームワールド内の位置を持つため、カメラ(やAudioListener2D)との距離に応じて音量が変わります。近づくほど大きく聞こえ、遠ざかるほど小さくなるのです。

継承ツリー:

AudioStreamPlayer2D → Node2D → CanvasItem → Node

Node2Dを継承しているため、global_positionプロパティで3D空間内の位置を持ちます。AudioStreamPlayer(非位置依存)とは異なり、spatial audioのコンセプトに基づいて設計されています。




AudioStreamPlayer2Dの距離減衰
音源までの距離が遠いほど、音量が減衰します。リスナー(通常はCamera2D)との距離で自動計算されます

このノードを使うべき場面

爆発音(発生位置から距離で減衰)

爆発が画面中央で起きるときは大きく、画面外で起きるときは小さく聞こえます。これはゲーム空間の現実感を大きく高めます。

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




attenuationの値による減衰カーブの違い
左からattenuation 0.5, 1.0, 2.0, 3.0。値が大きいほど、距離に応じた減衰が急峻になります

もっと使いこなす:カスタマイズできるパラメータ

カスタマイズ項目 設定方法 効果
複数のオーディオバスの管理 audio_player.bus = "SFX" # SFXバスに割り当て
audio_player.bus = "Ambient" # 環境音バスに割り当て
オーディオバスを使用して、複数の音源をグループ化し、マスター音量や効果を一括制御
pitch_scaleで音の高さを動的に変更 audio_player.pitch_scale = randf_range(0.8, 1.2)
# 毎回異なる高さで再生
同じ足音でも毎回微妙に異なる高さで再生し、不自然さを軽減
マックス距離の動的調整 audio_player.max_distance = 1000.0
# ゲームの進行に応じて変更可能
ゲームの状況(屋外vs屋内など)に応じて、音の聞こえる範囲を動的に変更
AudioListener2Dでカスタムリスナーを設定 var listener = AudioListener2D.new()
listener.current = true
add_child(listener)
通常はCamera2Dに基づいて減衰が計算されるが、カスタムリスナーを使用することで、より柔軟な音響空間を設計
finishedシグナルで連続再生を制御 audio_player.finished.connect(_on_audio_finished)

func _on_audio_finished():
audio_player.play() # ループ再生

ループ機能がないAudioStreamに対して、finishedシグナルで自動ループを実装

まとめ

AudioStreamPlayer2Dは、ゲーム空間に「音響的な立体性」をもたらすノードです。視覚的な表現と同じくらい重要な、音響表現をリアルに実装できます。敵の足音で距離を認識させたり、環境音で世界観を構築したり、爆発音で事象の衝撃を伝えたり——これらすべてが、AudioStreamPlayer2Dを使いこなすことで可能になるのです。このシリーズは今後も続きます。Godot 4の他の重要なノードについても、今後解説していく予定です。

  • AudioStreamPlayer2Dは、ゲーム空間内の位置を持つ音源を表現するノード
  • max_distanceとattenuationで、距離に応じた自然な音量減衰を実現
  • 複数のAudioStreamPlayer2Dを組み合わせることで、豊かな音響環境を構築可能

これまで096~100の5つのノードを詳しく解説してきました。DirectionalLight2D、LightOccluder2D、ParallaxBackground、ParallaxLayer、AudioStreamPlayer2D——これらのノードをマスターすることで、2Dゲーム開発の幅が大きく広がります。今後のシリーズでも、さらに多くの有用なノードを紹介していく予定です。

シリーズ:Godot 4 ノード解説

このシリーズは、Godot 4でよく使用されるノードの使い方を詳しく解説しています。

この記事はGodot 4.xをもとに執筆しています。


コメント