この記事について

UIのボタンを押したときに効果音を鳴らすには、音声ファイルをAudioStreamPlayerへ設定し、play()を呼びます。この記事では、再生中だけボタンを無効にし、再生が終わったら再び押せる小さな画面を作ります。

Godot 4.6.3のGDScriptを使い、エディターの項目名は英語表記で説明します。AudioStreamPlayerは位置によって聞こえ方を変えない音声再生用です。画面内の距離で音量を変えるAudioStreamPlayer2Dや3Dは使いません。

この記事でわかること

  • WAVファイルを読み込み、Streamへ割り当てる方法
  • ボタンからplay()を呼ぶ方法
  • finishedシグナルで自然な再生終了を受け取る方法

基本手順

完成サンプルはこちらのGodotプロジェクトZIPから開けます。ZIPを展開し、Project ManagerのImportでproject.godotを選んでください。自分で新規作成する場合は、レンダラーをCompatibilityにして進めます。

手順1:短いWAVファイルを用意する

付属サンプルの09_audioフォルダーにあるui_click.wavを使います。本サンプル用に作成した0.45秒のオリジナル音声です。新しいプロジェクトで試す場合は、project.godotと同じフォルダーへこのファイルをコピーし、GodotのFileSystemドックにui_click.wavが表示されるまで待ってください。

FileSystemでui_click.wavを選び、Importタブを開きます。Loop ModeがDisabledになっていることを確認し、変更した場合はReimportを押します。ループする音声では、この記事の自然終了を待つ処理が終わりません。

手順1:WAVを選び、Loop ModeをDisabledにしてReimportします。
手順1:WAVを選び、Loop ModeをDisabledにしてReimportします。

手順2:ボタンとAudioStreamPlayerを追加する

Scene → New Scene → User InterfaceでControlを作り、SoundUIと名付けてmain.tscnへ保存します。SoundUIの子にVBoxContainerを置いてContentとし、Label2つとButtonを追加します。さらにSoundUI直下へAudioStreamPlayerを追加してClickSoundと名付けます。

SoundUI (Control)
├ Content (VBoxContainer)
│ ├ TitleLabel (Label)
│ ├ StatusLabel (Label)
│ └ PlayButton (Button)
└ ClickSound (AudioStreamPlayer)

ContentのLayout → TransformでPositionをX=40、Y=40、SizeのXを640にします。Separationは16、Font Sizeは24、PlayButtonのCustom Minimum SizeのYは48です。TitleLabelを「ボタンで効果音を鳴らす」、StatusLabelを「再生ボタンを押してください」、PlayButtonを「効果音を再生」にします。

手順2:ClickSoundはSoundUI直下へ置きます。
手順2:ClickSoundはSoundUI直下へ置きます。

手順3:音声ファイルをStreamへ設定する

ClickSoundを選びます。FileSystemのui_click.wavをInspectorのStream欄へドラッグしてください。Volume dBを-12、Pitch Scaleを1、BusをMasterにし、Autoplayはオフにします。Max Polyphonyは1のままです。

Volume dBは元の音に対する音量調整です。まずOSやスピーカーの音量を低めにして試してください。このサンプルでは、再生中の連打をコードで防ぎ、1つの音を最後まで再生します。

手順3:Streamへ音声を設定し、Volume dBを-12、Autoplayをオフにします。
手順3:Streamへ音声を設定し、Volume dBを-12、Autoplayをオフにします。

手順4:再生と終了のコードを書く

SoundUIにres://main.gdをAttach Scriptで付け、Templateを外して作成します。次の内容を入力してください。シグナルは_ready()で接続するため、Signalsタブで追加接続しません。

extends Control

@onready var sound: AudioStreamPlayer = $ClickSound
@onready var play_button: Button = $Content/PlayButton
@onready var status_label: Label = $Content/StatusLabel
var completed: int = 0

func _ready() -> void:
	play_button.pressed.connect(_play_sound)
	sound.finished.connect(_on_sound_finished)

func _play_sound() -> void:
	if sound.stream == null:
		status_label.text = "Streamに音声を設定してください"
		return
	play_button.disabled = true
	status_label.text = "再生中..."
	sound.play()

func _on_sound_finished() -> void:
	completed += 1
	status_label.text = "再生完了: %d 回" % completed
	play_button.disabled = false

_play_sound()はStreamがあるか確かめ、ボタンを押せない状態にしてから再生します。_on_sound_finished()は音が最後まで再生されたときに呼ばれます。完了回数を更新し、Disabledをfalseへ戻します。

手順4:pressedで再生し、finishedでボタンを再び押せる状態へ戻します。
手順4:pressedで再生し、finishedでボタンを再び押せる状態へ戻します。

手順5:音と画面表示を確認する

保存してF6で実行します。「効果音を再生」を1回クリックすると、短い音が再生され、終了後に「再生完了: 1 回」と表示されます。もう一度押すと2回です。再生中はボタンが無効になり、終了後に押せる状態へ戻ります。

独立したウィンドウで試す場合は、保存後にProject → Quit to Project Listへ戻り、Project Managerでこのプロジェクトを選んでRunを押します。独立実行を終えるときは、その実行ウィンドウを閉じます。

実行画面のカウンターで確認できるのは再生終了の通知です。音が実際に聞こえるかは別に確認します。カウンターだけ増えて無音なら、Streamの設定とあわせてGodotのMasterバス、OSの出力先、ミュート状態を調べてください。

手順5:再生中はボタンを無効化し、自然終了後に完了回数を表示します。
手順5:再生中はボタンを無効化し、自然終了後に完了回数を表示します。

うまくいかないときの確認箇所

Streamに音声を設定してくださいと表示される

ClickSoundのStreamが空欄になっています。ファイルがFileSystemへ読み込まれているか確認し、ui_click.wavを割り当てます。ファイルを移動した直後に読み込みエラーが出ている場合は、Debuggerのパスも確認してください。

音が聞こえない

最初に再生完了の表示が増えるか確認します。増える場合は、ClickSoundのVolume dB、AudioパネルのMasterバスのミュート、OS音量と出力先を順に調べます。再生状態のログだけでスピーカーから音が出ているとは判断できません。

ボタンが無効のまま戻らない

WAVのLoop ModeがDisabledか、finishedを_on_sound_finishedへ接続しているか確認します。stop()による途中停止ではfinishedは出ません。停止ボタンを追加する場合は、stop()に加えてボタンのDisabledを戻す処理も書く必要があります。

音が途中で切れる、または勝手に鳴る

Autoplayがオンならシーンへ入った時に再生が始まります。別のコードからもplay()を呼んでいないか確認してください。Max Polyphonyが1のときに再びplay()を呼ぶと、古い再生が打ち切られます。この記事では、再生中にボタンを無効にして重ねて再生しない構成にしています。

まとめ

ボタンの効果音は、AudioStreamPlayerに音声を設定し、play()で再生するところから始められます。finishedで終了後の操作を戻すときは、ループ音とstop()による中断を区別してください。画面の再生状態と、出力機器から聞こえる音をそれぞれ確認しましょう。