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

はじめに

ゲームの音響設計では、3D空間内の位置から音が聞こえるという表現が重要です。キャラクターの足音、敵の鳴き声、環境音——こうした「位置依存的な音」を再生するのがAudioStreamPlayer3Dです。

本記事では、AudioStreamPlayer3Dの基本から応用まで、実装パターンを交えて解説します。

AudioStreamPlayer3Dとは?

AudioStreamPlayer3Dは、3D空間上の位置から音を再生するノードです。リスナー(通常はカメラ)との距離や方向に応じて、音量やパン(左右の音響バランス)が自動的に変化します。

継承ツリー:

AudioStreamPlayer3D → Node3D → Node → Object

AudioStreamPlayer(位置なし)やAudioStreamPlayer2D(2D)とは異なり、AudioStreamPlayer3Dは「シーン内の特定の場所から音が発せられる」という現実的な音響効果をもたらします。

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

活躍する場面:

  • キャラクターの足音(歩く位置が聞こえる)
  • NPC のセリフやボイス
  • 敵の鳴き声、環境音(鳥の声、風音)
  • 乗り物のエンジン音(車、飛行機)
  • 環境オブジェクトからの音(滝、火など)

使わない場面:

  • 位置に依存しないBGM(AudioStreamPlayer を使う)
  • 単純な UI 音効(2D UI なら AudioStreamPlayer で十分)

主なプロパティと機能

AudioStreamPlayer3Dの基本的なプロパティを表にまとめました:

プロパティ 説明 デフォルト値
stream AudioStream 再生する音声ファイル(.ogg, .mp3, .wav) null
volume_db float 基本の音量(デシベル) 0.0
unit_size float 距離減衰の基準距離(メートル) 1.0
max_db float 最大音量(デシベル) 3.0
pitch_scale float 再生速度・ピッチの倍率 1.0
bus String 出力先のオーディオバス名 “Master”
attenuation_model enum 距離による音量減衰の計算方式 ATTENUATION_INVERSE_DISTANCE

基本的な使用例:


extends Node3D

@onready var audio_player = $AudioStreamPlayer3D

func _ready():
	# 音声ファイルを設定
	audio_player.stream = preload("res://sounds/footstep.ogg")

	# 基本の音量設定
	audio_player.volume_db = -5.0  # やや静かく

	# 距離減衰の基準
	audio_player.unit_size = 2.0  # 2メートルで音量が半減する

	# ピッチを少しランダムに(バリエーション)
	audio_player.pitch_scale = randf_range(0.9, 1.1)

func play_footstep():
	# 足音を再生
	if not audio_player.playing:
		audio_player.play()

func stop_sound():
	audio_player.stop()




AudioStreamPlayer3Dの距離減衰パターン
距離が遠いほど音量が小さくなり、リアルな音響が実現されます

敵キャラの鳴き声実装例:


extends CharacterBody3D

@onready var sound_player = $AudioStreamPlayer3D

var sound_interval = 3.0
var sound_timer = 0.0

func _ready():
	sound_player.stream = preload("res://sounds/enemy_growl.ogg")
	sound_player.volume_db = -3.0
	sound_player.attenuation_model = AudioStreamPlayer3D.ATTENUATION_LOGARITHMIC

func _process(delta):
	sound_timer += delta
	if sound_timer >= sound_interval:
		play_growl()
		sound_timer = 0.0

func play_growl():
	# ピッチをランダムに変更して同じ音でも違って聞こえるように
	sound_player.pitch_scale = randf_range(0.8, 1.2)
	sound_player.play()

AudioStreamPlayer / AudioStreamPlayer2D / AudioStreamPlayer3D の比較

3種類の音声ノードがどう異なるかを理解することは、適切な実装の鍵です:

ノード 位置情報 動作環境 用途例 音響特性
AudioStreamPlayer なし(2D でも 3D でも使用可) 2D/3D 共通 BGM、UI音 ステレオ固定(距離感なし)
AudioStreamPlayer2D 2D平面上の位置 2Dシーンのみ 2Dゲーム効果音、NPC の声 左右パン変化あり、距離減衰あり
AudioStreamPlayer3D 3D空間上の位置 3Dシーンのみ 3D環境音、足音、敵の声 完全な3D定位、距離減衰、ドップラー効果対応

attenuation_model の種類と使い分け

距離に応じた減衰モデルは、ゲームの雰囲気を大きく左右します:

attenuation_model 減衰パターン 用途例 リアル度
INVERSE_DISTANCE 距離の逆数で減衰 現実的な音響(足音、敵の声) 高い
INVERSE_DISTANCE_SQUARED 距離の二乗に反比例 音の減衰が速い(爆発など) 中程度
LOGARITHMIC 対数的な減衰 自然な減衰(人間の聴覚に近い) 高い
DISABLED 距離無視、音量固定 環境音、背景音(広範囲で同じ音量) 低い

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

まずは基本を動かしてみてから、余裕が出たら試してみてください。

パラメータ 設定値の例 効果
max_distance 50.0 〜 200.0 聞こえなくなる最大距離。これ以上遠いと音が出ない
doppler_tracking DOPPLER_TRACKING_IDLE_LISTENER ドップラー効果有効(音源が動く時の周波数変化)
panning_strength 1.0 (デフォルト) 左右のパン強度。高いほど定位がはっきり
area_mask 1 〜 32 複数の音声レイヤーで優先度制御
pitch_scale 0.5 〜 2.0 再生速度・周波数の倍率。バリエーション付与に有効

まとめ

AudioStreamPlayer3Dは、3D空間に位置感のある音を追加し、ゲームの没入感を大幅に向上させるノードです。距離減衰とパン処理により、リアルな音響環境が実現されます。

  • attenuation_model を適切に選択することで、ゲームの雰囲気と現実感をコントロールできる
  • unit_size で減衰の基準距離を調整し、シーンのスケール感に合わせられる
  • pitch_scale のランダム化で、同じ音でもバリエーション豊かに聞こえさせることができる

次回は GPUParticles3D について解説します。GPU処理による高速な3Dパーティクルエフェクトです。

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

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

001〜040:各種ノード

  • 041:Control
  • 042:Button
  • 043:Label
  • 044:TextEdit
  • 045:Panel
  • 046:VBoxContainer
  • 047:AnimationPlayer
  • 048:Timer
  • 049:Area3D
  • 050:RigidBody3D
  • 051:CharacterBody3D
  • 052:CollisionShape3D
  • 053:MeshInstance3D
  • 054:Node3D
  • 055:Camera3D
  • 056:Sprite3D
  • 057:DirectionalLight3D
  • 058:OmniLight3D
  • 059:ReflectionProbe
  • 060:VisibleOnScreenNotifier3D
  • 061:SpotLight3D
  • 062:WorldEnvironment
  • 063:AudioStreamPlayer3D
  • 064:GPUParticles3D
  • 065:CSGBox3D
  • 066:GridMap
  • 067:Decal
  • 068:OccluderInstance3D
  • 069:LightmapGI
  • 070:SubViewport

コメント