概要
動作確認環境: Godot 4.3+
AudioBusにエフェクトを追加すると、そのバスを通る全ての音に一括で効果を適用できます。洞窟の残響、水中のこもった音、ラジオ風の加工など、エフェクトの組み合わせ次第でゲームの音響空間を自在に作り込めます。
本記事では、AudioBusのレイアウト設計からリバーブ・コンプレッサー・EQなど主要エフェクトの設定方法、GDScriptによる動的制御までを解説します。
AudioBusレイアウトの設計
エフェクトを適用する前に、まずはバスの整理から始めましょう。ここを雑に済ませると、後から「BGMだけにリバーブをかけたいのにSEにもかかってしまう」といった問題に悩まされます。
Godotのオーディオシステムでは、複数のバスを用途別に分けることで、後から一括でエフェクトをかけたり音量調整したりできるようになります。
推奨バス構成
Master(マスター出力)
├── BGM … 音楽全般
├── SFX … 効果音
├── Voice … ボイス・ダイアログ
└── Ambient … 環境音
バスの作成手順
- エディタ下部の 「オーディオ」 タブを開く
- 「バスを追加」 をクリック
- バス名を設定(例:
SFX) - Send を
Masterに設定(デフォルト) audio_bus_layout.tresとして保存
AudioServer APIの基本
バスのレイアウトが決まったら、GDScriptから制御する方法も押さえておきましょう。オプション画面での音量スライダーなど、プログラムから操作したい場面は多いです。
# バスインデックスの取得
var sfx_idx = AudioServer.get_bus_index("SFX")
# 音量の設定(デシベル単位)
AudioServer.set_bus_volume_db(sfx_idx, -6.0)
# ミュートの切り替え
AudioServer.set_bus_mute(sfx_idx, true)
# ソロ再生(デバッグ用)
AudioServer.set_bus_solo(sfx_idx, true)
音源をバスに割り当てる
バスレイアウトを設計しても、実際に音がそのバスを通らなければ意味がありません。AudioStreamPlayer(2D/3D含む)のbusプロパティで出力先バスを指定します。
# スクリプトからバスを指定
$AudioStreamPlayer.bus = "SFX"
$BGMPlayer.bus = "BGM"
$FootstepPlayer.bus = "SFX"
インスペクタの「Bus」プロパティからも設定できます。指定しない場合はMasterバスに出力されます。
主要エフェクトと設定
バスレイアウトが整ったところで、いよいよエフェクトの設定に進みましょう。Godotには音響 空間を演出するためのエフェクトが複数用意されています。ここでは特に使用頻度の高いリバーブ、コンプレッサー、EQについて解説します。
AudioEffectReverb(リバーブ)
洞窟のエコーや大聖堂の荘厳な残響など、空間の広さや材質を音で表現したいときの定番エフェクトです。
| プロパティ | 説明 | 推奨範囲 |
|---|---|---|
room_size | 部屋の大きさ | 0.2(小部屋)〜 0.9(大聖堂) |
damping | 高周波の減衰 | 0.3〜0.8 |
wet | エフェクトの混合比 | 0.1〜0.5 |
dry | 原音の混合比 | 0.5〜1.0 |
spread | ステレオの広がり | 0.5〜1.0 |
AudioEffectCompressor(コンプレッサー)
「爆発音は大きいのに足音が小さすぎる」と感じたことはありませんか? コンプレッサーは音量の大小差を均一化してくれます。SEの音量を揃えたり、マスターバスの音圧を上げたりする際に使います。
| プロパティ | 説明 | 推奨値 |
|---|---|---|
threshold | 圧縮が始まる音量 | -20〜-10 dB |
ratio | 圧縮比率 | 2:1〜4:1 |
attack_us | 圧縮開始までの時間 | 5000〜20000 μs |
release_ms | 圧縮解除までの時間 | 100〜300 ms |
gain | 出力ゲイン | 0〜6 dB |
AudioEffectEQ(イコライザー)
周波数帯域ごとの音量を調整するエフェクトです。低音を強調して迫力を出したり、高音をカットして水 中の音を再現したりと、用途は幅広いです。6バンド、10バンド、21バンドから選択できます。
# EQ10のバンド構成
# 0: 31Hz, 1: 62Hz, 2: 125Hz, 3: 250Hz, 4: 500Hz
# 5: 1kHz, 6: 2kHz, 7: 4kHz, 8: 8kHz, 9: 16kHz
# 低音を強調
var eq = AudioEffectEQ10.new()
eq.set_band_gain_db(0, 6.0) # 31Hz +6dB
eq.set_band_gain_db(1, 4.0) # 62Hz +4dB
eq.set_band_gain_db(2, 2.0) # 125Hz +2dB
その他のエフェクト
| エフェクト | 用途 | 主なプロパティ |
|---|---|---|
AudioEffectDelay | エコー・やまびこ | tap1_delay_ms, tap1_level_db, feedback_level_db |
AudioEffectChorus | 音に厚みを追加 | voice_count, voice_rate_hz, voice_depth_ms |
AudioEffectLimiter | 音割れ防止 | ceiling_db, threshold_db |
AudioEffectDistortion | 歪み・ラジオ風 | mode, drive, pre_gain |
エフェクトの推奨チェーン
個々のエフェクトがわかったところで、次はそれらをどの順番で組み合わせるかが重要になります。バス内のエフェクトは 上から順に処理 されるため、順序を間違えると意図しない音になりがちです。ここでは用途別の推奨構成を紹介します。
マスターバスの推奨構成
Master Bus
├── 1. AudioEffectEQ10 … 全体 の周波数バランス調整
├── 2. AudioEffectCompressor … 音量の均一化
└── 3. AudioEffectLimiter … 音割れ防止(ceiling: -0.5dB)
SFXバスの推奨構成
SFX Bus
├── 1. AudioEffectEQ6 … 不要な低音をカット
└── 2. AudioEffectCompressor … SE同士の音量差を抑制
環境音バスの推奨構成
Ambient Bus
├── 1. AudioEffectReverb … 空間の残響を付与
└── 2. AudioEffectChorus … 自然な広がりを追加
tips: エフェクトを追加しすぎるとCPU負荷が増加します。必要最小限のエフェクトに留めましょう。
GDScriptによる動的制御
エディタでの静的な設定だけでなく、ゲームプレイ中にエフェクトを動的に変化させることもできます。洞窟に入ったらリバーブをかける、水中に潜ったら高音をカットする――こうした演出をスクリプトで実現してみましょう。
エフェクトの動的追加
以下の例では、プレイヤーが洞窟エリアに入ったときにSFXバスへリバーブを追加し、出たときに削除しています。
# SFXバスにリバーブを追加
func enter_cave():
var sfx_idx = AudioServer.get_bus_index("SFX")
var reverb = AudioEffectReverb.new()
reverb.room_size = 0.8
reverb.wet = 0.3
reverb.damping = 0.5
AudioServer.add_bus_effect(sfx_idx, reverb)
# リバーブを削除(型で検索して安全に削除)
func exit_cave():
var sfx_idx = AudioServer.get_bus_index("SFX")
remove_effect_by_type(sfx_idx, AudioEffectReverb)
# 指定した型のエフェクトをバスから検索して削除
func remove_effect_by_type(bus_idx: int, effect_type) -> void:
for i in range(AudioServer.get_bus_effect_count(bus_idx) - 1, -1, -1):
if AudioServer.get_bus_effect(bus_idx, i) is effect_type:
AudioServer.remove_bus_effect(bus_idx, i)
return
インデックスを直接指定して削除する方法(remove_bus_effect(idx, count - 1))は、他のエフェクトが後から追加された場合に意図しないエフェクトを削除するリスクがあります。上記のように型で検索して削除する方が安全です。
エフェクトパラメータのリアルタイム変更
エフェクトを追加/削除するだけでなく、パラメータを滑らかに変化させることもできます。Tweenと組み合わせると、屋外から洞窟に入るときの音響変化を自然に演出できます。
# リバーブのwet値をTweenで滑らかに変化
func transition_reverb(target_wet: float, duration: float = 1.0):
var sfx_idx = AudioServer.get_bus_index("SFX")
var reverb = find_effect_by_type(sfx_idx, AudioEffectReverb)
if reverb:
var tween = create_tween()
tween.tween_property(reverb, "wet", target_wet, duration)
# 指定した型のエフェクトをバスから検索して取得
func find_effect_by_type(bus_idx: int, effect_type) -> AudioEffect:
for i in range(AudioServer.get_bus_effect_count(bus_idx)):
var effect = AudioServer.get_bus_effect(bus_idx, i)
if effect is effect_type:
return effect
return null
バス音量のフェード制御
シーン遷移時のBGMフェードアウトや、ポーズ画面でのSFXミュートなど、バス単位での音量フェードも頻繁に使うテクニックです。
# バス音量をフェードイン/アウト
func fade_bus(bus_name: String, target_db: float, duration: float = 0.5):
var idx = AudioServer.get_bus_index(bus_name)
if idx == -1:
return
var current_db = AudioServer.get_bus_volume_db(idx)
var tween = create_tween()
tween.tween_method(
func(db): AudioServer.set_bus_volume_db(idx, db),
current_db, target_db, duration
)
ユースケース別エフェクト設定
最後に、実際のゲーム制作でよく使われるシチュエーション別のエフェクト設定例をまとめました。「このシーンにはどんなエフェクトが合う?」と迷ったときのリファレンスとして活用してください。
| シチュエーション | 使用エフェクト | 設定のポイント |
|---|---|---|
| 洞窟・地下 | Reverb | room_size: 0.8, wet: 0.3, damping: 0.4 |
| 水中 | EQ + Reverb | 高音域をカット(4kHz以上を-12dB)、リバーブを強め |
| 屋外・草原 | Reverb(軽め) | room_size: 0.3, wet: 0.1 |
| ラジオ・通信機 | Distortion + EQ | mode: OVERDRIVE, 中音域のみ残す |
| ボス戦 | Compressor | マスターバスで音圧を上げる |
| メニュー画面 | EQ + Limiter | BGMを控えめにし、UI音を際立たせる |
まとめ
- AudioBusにエフェクトを追加すると、そのバスを通る全ての音に一括で効果を適用できる
- リバーブは空間表現、コンプレッサーは音量均一化、EQは周波数バランス調整に使う
- エフェクトの処理順序はEQ → コンプレッサー → リバーブ → リミッターが基本
AudioServer.add_bus_effect()で動的にエフェクトを追加・削除でき、シーンに応じた音響切り替えが可能- エフェクトの追加はCPU負荷に影響するため、必要最小限に留める