無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、サウンドファイルを1回だけ再生する自作の静的関数( GD スクリプト)を紹介します。
クリックしたときの効果音など、タイミングが重複して任意の回数サウンドを再生する際などに使うために作りました。
再生が完了すると動的に作成したノードは自動的に解放されます。
※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご使用ください。
音を再生するノード
音を再生するために AudioStreamPlayer ノードを使用します。
決められた数だけ音を同時再生する場合は、その個数の AudioStreamPlayer ノードをシーンに配置することで実現できます。
The AudioStreamPlayer node plays an audio stream non-positionally. It is ideal for user interfaces, menus, or background music.
AudioStreamPlayer ノードは、オーディオ ストリームを非位置的に再生します。ユーザー インターフェイス、メニュー、または BGM に最適です。AudioStreamPlayer — Godot Engine (4.x)の日本語のドキュメント と Google 翻訳
しかし、クリックの効果音など、同時にいくつの音の再生が行われるかわからない場合の実装方法としては、スクリプトで AudioStreamPlayer ノードを動的に生成して、再生が完了したらノードを自動的に解放するなどの処理が考えられます。
サウンドを一回だけ再生する静的関数
以下が音を1回だけ再生する静的関数です。
※スクリプトの説明や、使用例はスクリプトの説明をご覧ください。
upper_node 引数は、関数内部で動的に作成した AudioStreamPlayer ノードを再生が完了するまで一時的に配置する上位ノードです。upper_node はシーンに配置されている必要があります。
audio_stream 引数で渡された AudioStream の音を1回だけ再生します。
extends Node
class_name SCUtil
## ユーティリティ関数を定義します。
##
## SakuraCrowd が作成した関数です。自己責任でご利用ください。
## [b]指定した音声ストリームを1回再生します。[/b][br]
## [br]
## 内部で生成された [AudioStreamPlayer] ノードは [param upper_node] の下位ノードに一時的に追加されます。[br]
## 内部で生成された [AudioStreamPlayer] ノードは finished シグナルにより自身を解放します。[br]
## [param audio_stream] は、あらかじめ load または preload 関数で AudioStream を作成してください。[br]
## [codeblock]
## # 処理が開始される前にメンバ変数に読み込む場合
## @onready var as1: AudioStream = preload("res://sound/Button.wav")
##
## # 関数内などで読み込む場合
## func hoge():
## var as2: AudioStream = load("res://sound/Hit.wav")
## AudioStreamOneShotPlay(self, as1)
## AudioStreamOneShotPlay(self, as2)
## # 本関数呼び出し時に読み込む場合
## AudioStreamOneShotPlay(self, load("res://sound/Break.wav"))
## return
## [/codeblock]
static func AudioStreamOneShotPlay(upper_node: Node, audio_stream: AudioStream) -> void:
# AudioStreamPlayer ノードを作成して、指定されたノードの下位に一時的に追加します。
var audio_player: AudioStreamPlayer = AudioStreamPlayer.new()
upper_node.add_child(audio_player)
# 再生する音声ストリームを設定します。
audio_player.stream = audio_stream
# 音声が再生終了した時のシグナルを接続して、自動的に生成したノードを解放します。
audio_player.connect("finished", audio_player.queue_free)
# 音を再生します。
audio_player.play()
return
動的に new() 関数で生成したノードは、きちんと解放する必要があります。
今回は audio_player.connect 関数で、音が再生したときに発火する finished シグナルで、自身を解放する queue_free メンバ関数を接続しておくことで、再生完了時に生成したノードを解放しています。
関数を呼び出すテスト用スクリプト
例として、新規シーンで「ユーザインターフェース」を選択して、作成された Control ルートノードに以下を割り当てました。
Control ルートノードは TitleScene という名前に変更しました。
また、「Click to Start」のメッセージを表示する Label ノードを下位に追加しています。
※ Label ノードはなくてもテストできます。
以下が、テスト用のスクリプトです。
クリックされると preload 関数であらかじめ読み込んでいた AudioStream の音を再生します。
extends Control
## ブロックにぶつかりブロックを壊した際の効果音を読み込んで保持します。
@onready var audio_stream_break: AudioStream = preload("res://sound/Break.wav")
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
# マウス左ボタン(クリック) が押された直後の場合
if Input.is_action_just_pressed("ui_click"):
print("_process(): マウス左ボタンが押されました。")
# ボタンの効果音を再生します。
SCUtil.AudioStreamOneShotPlay(SCUtilGlobal, audio_stream_break)
return
テスト
F5 キーなどでテスト用スクリプトが割り当てられたシーンを実行します。
クリックすると音が一回再生され、連打して複数の音が重なってもそれぞれの音がきちんと最後まで再生されました。
関連記事
クリックを検知する処理については以下の記事を参照してください。
まとめ
今回は、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、サウンドファイルを1回だけ再生する自作の静的関数( GD スクリプト)を紹介しました。
クリックしたときの効果音など、タイミングが重複して任意の回数サウンドを再生する際などに使うために作りました。
再生が完了すると動的に作成したノードは自動的に解放されます。
参照サイト Thank You!
- Godot Engine – Free and open source 2D and 3D game engine
- AudioStreamPlayer — Godot Engine (4.x)の日本語のドキュメント
- AudioStream — Godot Engine (4.x)の日本語のドキュメント
- @GDScript — Godot Engine (4.x)の日本語のドキュメント #method-preload
- Control — Godot Engine (4.x)の日本語のドキュメント
記事一覧 → Compota-Soft-Press
コメント