【Godot4.x】オーディオ再生の基本について

今回はGodotにおけるオーディオ再生の基本について書きます。

オーディオ再生までの流れ

まずはGodot Engineにおけるオーディオ再生までの流れについて確認しておきます。

DAWなどのサウンド作成ツールでオーディオデータを作成します。そしてそれをGodotでインポートして AudioStream というリソースで各種設定を行います。そのリソースを AudioStreamPlayerで読み込んで再生や停止を行う、というのが基本的な流れです。

Godot4.3では、インタラクティブミュージックの機能が採用されて特殊なリソースを作ることができるようになりましたが、それは別の記事で紹介したいと思います。

読み込み可能なサウンドフォーマット

Godot Engineでは、WAV, MP3, OGG の3つのフォーマットを扱うことができます。 それぞれのフォーマットごとの概要は以下のとおりです。

フォーマット 概要
WAV 汎用性が高くインポート設定が豊富。
SE (効果音) 向き。
非圧縮なのでファイルサイズが大きい
MP3, OGG BGM用のインポート設定がある。
BGM向きでファイルサイズが小さい

個人的にはBGM, SE含めて "MP3" が良いかなと思います。理由としてはファイルサイズが小さく、macOSのみですが Finder上でSPACEキーでプレビューができます。 また昔は MP3には著作権料の問題があり OGGが推奨されていましたが、今ではその権利も失効しています。

ただ MP3は古いフォーマットであり、同ビットレートではOGGのほうが音質が良いため、OGGが好まれることもあります。

インポート設定

オーディオデータをプロジェクトに追加するとファイルシステムに表示されますが、インポート設定は「シーン」タブの隣にある「インポート」タブをクリックします。

なお MP3とOGGはリソースをダブルクリックで別ウィンドウで高度な設定が表示されます。

高度な設定画面はここからも表示できます。

どちらで設定を行うにしても設定を反映するには「再インポート」ボタンをクリックする必要があります。

WAVのインポート設定

WAVはインポート設定が豊富に用意されています。

カテゴリ 項目 説明
Force
(強制変換設定)
8ビット化 音質を落としてファイルサイズを削減
モノラル化 左右チャネルを合成してモノラル化
最大レート適用 指定レートに抑える
(不要な高周波をカットして軽量化)
編集
(エディット処理)
前後のトリム 無音部分の削除
ノーマライズ 音量を一定値に調整
ループモード ・Detect From WAV(埋め込みループ情報を使用)
・Disabled(無効)
・Forward(順再生ループ)
Ping-Pong(往復ループ)
・Backward(逆再生ループ)
ループ開始/終了 数値で位置を指定可能
圧縮 ・PCM (Uncompressed):非圧縮、高音質、大容量
・IMA ADPCM:軽量、やや劣化
・Quite OK Audio (QOA):比較的新しい圧縮方式、品質とサイズのバランス

MP3, OGGのインポート設定

MP3, OGGは BGM用のインポート設定が用意されています。

カテゴリ 項目 説明
ループ ON/OFF ループの有効化。
ONにするとオーディオの終端で先頭に戻ります
ループオフセット ループ開始位置を秒単位で指定
再生設定 BPM ビート情報に必要なテンポを設定
ビート数 ループ再生に必要なビート数を設定。
"0" を指定するとオーディオの長さから自動で計算
1小節あたりの拍数 ループ再生やインタラクティブミュージックで使われます

基本的にBGMのループに関する設定です。ループがうまくつながらない場合は、ここの設定を正しく行う必要があります。 2dgames.jp なおループオフセットを例えばイントロの終わりに設定することで、区間リピートが可能です。 詳しくは以下の記事に書いています。 2dgames.jp

AudioStreamPlayerについて

AudioStreamPlayerには2Dと3Dが存在するので、ゲームジャンルに合わせて適切に選びます。

3Dゲームでの3D空間で発生するサウンドは AudioStreamPlayer3D を使用して、それ以外は基本的に AudioStreamPlayer2D で良いと思います。例えば3DゲームであってもUI操作のSEは2Dを使うなどですね。

使い方としては、まずはシーンに配置します。

そしてインスペクターから Streamの <空> をクリックして「クイックロード」を選択。

インポートしたオーディオデータを選択。

後は "Autoplay" を ONにすると、シーン開始時に自動で再生されます。

任意のタイミングで再生したい場合は GDScriptで play() を呼び出します。

func _ready() -> void:
    # サウンドを再生.
    $AudioStreamPlayer2D.play()

なおSEなど多数のオーディオデータがある場合は、あらかじめ確保した AudioStreamPlayer のインスタンスを使いまわして再生すると良いです。 動的にサウンドをロードする方法は以下のページにまとめています。 2dgames.jp