2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、独自のシグナルと、それを受け取る受信側メソッドを作成して、お宝が出た際にスコアの値と表示を更新する実装例を紹介します。
※この記事の内容は、アプリ タップ The 宝箱 の開発でも使用しています。
※ GodotEngine のバージョンは 4.1.2 です。 .NET 版ではありません。
※「いらすとや」様の画像を使用しています。
※「ふい字」フォントを使用しています。
※「魔王魂」様のサウンドを動画内で使用しています。
※「無料効果音で遊ぼう!」様のサウンドを動画内で使用しています。
※記事で紹介するスクリプト / プログラム / コードは自己責任で使用してください。
前回の記事
前回は、音量の調節を行う水平なスライダーコントロール UI のシーンを作成してメインのシーンに配置しました。
独自のシグナルの作成
シグナルを発する GD スクリプトに以下のようにシグナルを定義します。
例では、お宝が飛び出した直後に発する otakara_spawned カスタムシグナルを定義します。
# お宝が出現した際に発せられるカスタムシグナルです。
signal otakara_spawned
シグナルは signal_name.emit() と emit メンバ関数を呼ぶことで発します。
例では、お宝を出現させた直後の 10 ~ 11 行目で otakara_spawned カスタムシグナルを発します。
# お宝の子ノードを動的に作成して、それを飛ばします。
# position : お宝の子ノードの初期位置です。
func spawn_otakara(position:Vector2):
# scene_otakara_coin シーンから、インスタンスを作成します。
var node_otakara:RigidBody2D = create_otakara()
node_otakara.position = position # 上位ノードの相対座標で設定します。そのため配置先はルートの下位にします。
node_otakara_temp.add_child(node_otakara) # シーンのお宝を一時的に配置するノードの下位に追加します。
# お宝が出現した直後にカスタムシグナルを発します。
otakara_spawned.emit()
# 以下略
スクリプトを割り当てている Takarabako ルートノードを選択して、ノードドックのシグナルタブを開くと、GD スクリプトに追加した signal otakara_spawned が表示されています。
独自のシグナルの受信側メソッドの作成
ラベルに表示されているスコアを更新するために、そのシグナルの受信側メソッドを作成します。
例ではメインのシーンの GameManager ルートノードに割り当てられている GD スクリプトにカスタムシグナルの受信側メソッドを追加します。
そのため、メインのシーンを開きます。
そして、カスタムシグナルを発する Takarabako.gd を割り当てている Takarabako 子ノードを選択します。
ノードドックのシグナルタブで、接続するカスタムシグナル otakara_spawned をダブルクリックします。
カスタムシグナルの接続先、受信側メソッドを置くスクリプトを割り当てられているノードに GameManager を選択した状態で「接続」ボタンを押します。
_on_takarabako_otakara_spawned 受信側メソッドが GameManager.gd に追加されました。
func _on_takarabako_otakara_spawned():
pass # Replace with function body.
シグナルと受信側メソッドへの引数の追加
お宝によって得られるスコアが変わるので、どのお宝が出現したかを要素番号の引数でつたえます。
そのため以下のようにシグナルの定義と、シグナルを発する関数呼び出しに引数を追加します。
# お宝が出現した際に発せられるカスタムシグナルです。
signal otakara_spawned(otakara_index:int)
# シグナルを発する処理
# お宝が出現する直前にカスタムシグナルを発します。
otakara_spawned.emit(index)
受信側メソッドも引数を追加しました。
# Takarabako.gd の otakara_spawned カスタムシグナルの受信側メソッドです。
func _on_takarabako_otakara_spawned(otakara_index:int):
# スコアを出現したお宝に応じて加算します。
score += list_score_stream_otakara[otakara_index]
# ラベルのテキストを更新します。
$CoinLabel.text = str(score)
return
引数はノードドックのシグナルタブにも反映されます。
テスト
F6 キーでメインのシーンを再生して、宝箱をクリックすると、お宝が放出されたタイミングで独自の otakara_spawned カスタムシグナルが発して、それを受けたメソッドによってスコアの値と表示が更新されました。
# スコアの数字が見えづらいので、背景画像を追加する予定です。
スコアの桁数について
「int — Godot Engine (4.x)の日本語のドキュメント」によると int の最大値は 9223372036854775807 で 19 桁なので、19 桁表示できるサイズに調整します。
現状は 18 桁だったの Font Size を 60 から 55 に下げます。
まとめ
今回は、2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、独自のシグナルと、それを受け取る受信側メソッドを作成して、お宝が出た際にスコアの値と表示を更新する実装例を紹介しました。
カスタムシグナルには引数を追加できることもわかりました。
参照サイト Thank You!
- Godot Engine – Free and open source 2D and 3D game engine
- かわいいフリー素材集 いらすとや
- 魔王魂 | 無料で使える森田交一の音楽
- 無料効果音で遊ぼう!
- シグナルの使用 — Godot Engine (4.x)の日本語のドキュメント#custom-signals
- int — Godot Engine (4.x)の日本語のドキュメント
記事一覧 → Compota-Soft-Press
コメント