はじめに
ゲームの音響設計では、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()

敵キャラの鳴き声実装例:
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


コメント