2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、たくさんのお宝が飛び出すタイミングごとに、効果音を複数同時に再生する手順を紹介します。
※この記事の内容は、アプリ タップ The 宝箱 の開発でも使用しています。
※ GodotEngine のバージョンは 4.1.2 です。 .NET 版ではありません。
※「いらすとや」様の画像を使用しています。
※「ふい字」フォントを使用しています。
※「魔王魂」様のサウンドを動画内で使用しています。
※「無料効果音で遊ぼう!」様のサウンドを動画内で使用しています。
※記事で紹介するスクリプト / プログラム / コードは自己責任で使用してください。
前回の記事
前回は、BGM を常にループ再生するための手順を紹介しました。
効果音のサウンドファイルをプロジェクトへ追加
ファイルシステムドックで sound フォルダを作成して、それを選択した状態でそこにエクスプローラの効果音のサウンドファイルをドラッグ&ドロップしてプロジェクトに追加します。
追加したサウンドファイルは以下の3つです。
- 「無料効果音で遊ぼう!」様のゲーム・ボタン音ページの
- coin01
コインが出たときの音 - correct_answer3
宝石が出たときの音 - button03a
後で使うかもしれないシステム音(主にボタン)
- coin01
AudioStreamPlayer2Dを動的に作成して音を再生するスクリプト
以下の静的関数をプロジェクト内の GD スクリプトに貼り付けます。
この静的関数では、動的に AudioStreamPlayer2D ノードを作成してシーンに一時的に配置して音を再生し、完了後に自身を消去しています。
詳細はコメントを参照してください。
static のついた静的関数はオブジェクトを必要としないので、ノードから呼び出さずに、直接関数を呼び出します。
# 一回だけ音を再生します。再生が終了すると動的に作成した AudioStreamPlayer2D は破棄されます。
# audio_stream : 再生する音源です。 mp3 などを preload した変数を渡してください。
# upper_node : 動的に作成した AudioStreamPlayer2D ノードを再生が終わるまで一時的に配置するノードです。
static func play_sound_one_shot(audio_stream:AudioStream, upper_node:Node)->void:
# 動的に AudioStreamPlayer2D ノードを作成します。
var player:AudioStreamPlayer2D = AudioStreamPlayer2D.new()
# 引数の AudioStream を設定します。
player.stream = audio_stream
# シーンの引数のノードの下位に AudioStreamPlayer2D ノードを配置します。
upper_node.add_child(player)
# audio_stream を再生します。
player.play()
# 再生の完了を待ちます。
await player.finished
# 動的に作成した AudioStreamPlayer2D ノードを破棄します。
player.queue_free()
return
外部の GD スクリプトから呼び出す場合は、
クラス名.play_sound_one_shot(audio_stream, upper_node)
と記述します。
クラス名は、 GD スクリプトの1行目に class_name の後に書かれているものになります。
例では、指定した確率で4種類の中から1つのお宝を作成する関数 create_otakara の 21 – 22 行目で呼び出しています。
# 指定された確率に応じて、複数のお宝の中からランダムに決めたお宝のノードを作成して返します。
func create_otakara() ->RigidBody2D:
# 全てのお宝の出現確率の合計値です。
var total_list_prob_scene_otakara = 0
# total_list_prob_scene_otakara を求めます。
for prob in list_prob_scene_otakara:
total_list_prob_scene_otakara += prob
# 0 ~ total_list_prob_scene_otakara の間からランダムに値を取得します。
var random_value:float = randf_range(0, total_list_prob_scene_otakara)
# 各お宝の出現確率を足していき、 random_value の範囲内にあるお宝の要素番号を得ます。
var tmp_total_list_prob_scene_otakara = 0
var index = 0
for prob in list_prob_scene_otakara:
tmp_total_list_prob_scene_otakara += prob
if random_value <= tmp_total_list_prob_scene_otakara:
break
index += 1
# お宝が出現するときの効果音を再生します。
SCUtil.play_sound_one_shot(list_audio_stream_otakara[index], get_tree().get_root())
# 確率に従いランダムに選択された要素番号のお宝のシーンを使って、ノードを作成して返します。
var selected_scene = list_scene_otakara[index]
var created_otakara:RigidBody2D = selected_scene.instantiate()
return created_otakara
第一引数は、再生する AudioStream で以下のようにしてファイルシステムドックに追加したサウンドファイルのパスを preload 関数に渡すと得られます。
var audio_stream:AutidoStream = preload("res://sound/coin01.mp3")
# 配列の場合
var list_audio_stream_otakara:Array[AudioStream]
list_scene_otakara.append(preload("res://sound/coin01.mp3"))
第二引数は、動的に作成した音を再生する AudioStreamPlayer ノードを配置する先です。
例では、ルートノードを配置先に指定してルートノードの直下に配置しています。
var root_node = get_tree().get_root()
テスト
F6 キーでメインのシーンを再生して、宝箱をクリックすると先ほど追加した効果音を再生する静的関数によって効果音が複数同時に再生されました。
まとめ
今回は、2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、たくさんのお宝が飛び出すタイミングごとに、効果音を複数同時に再生する手順を紹介しました。
1回だけ音を再生する static 関数とその呼び出し方についても紹介しました。
再生に必要な steream プロパティに設定する AudioStream は preload 関数などでプロジェクトのサウンドファイルを読み込むことで得られることもわかりました。
関連記事
BGM をループ再生する手順は以下の記事を参照してください。
確率に応じて4種類の中から一つのお宝を抽選して動的にノードとして作成する手順は以下の記事を参照してください。
参照サイト Thank You!
- Godot Engine – Free and open source 2D and 3D game engine
- かわいいフリー素材集 いらすとや
- 魔王魂 | 無料で使える森田交一の音楽
- 無料効果音で遊ぼう!
- AudioStreamPlayer2D — Godot Engine (4.x)の日本語のドキュメント
- 【Godot】サウンドを動的にロードして再生する方法 | 2dgames.jp
- How to create a AudioStreamPlayer in GDScript – Archive – Godot Forum
記事一覧 → Compota-Soft-Press
コメント