Godot4 独自シグナルを作成してお宝が出たときにスコアを更新する

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 が表示されています。

Godot4 TapTheTakarabako カスタムシグナルの作成例

独自のシグナルの受信側メソッドの作成

ラベルに表示されているスコアを更新するために、そのシグナルの受信側メソッドを作成します。

例ではメインのシーンの GameManager ルートノードに割り当てられている GD スクリプトにカスタムシグナルの受信側メソッドを追加します。
そのため、メインのシーンを開きます。

そして、カスタムシグナルを発する Takarabako.gd を割り当てている Takarabako 子ノードを選択します。

Godot4 TapTheTakarabako メインのシーンを開き、カスタムシグナルを持つTakarabako子ノードを選択します.

ノードドックのシグナルタブで、接続するカスタムシグナル otakara_spawned をダブルクリックします。

Godot4 TapTheTakarabako 接続するカスタムシグナルをダブルクリックします.

カスタムシグナルの接続先、受信側メソッドを置くスクリプトを割り当てられているノードGameManager を選択した状態で「接続」ボタンを押します。

Godot4 TapTheTakarabako カスタムシグナルの受信側メソッドをメインのシーンのルートノード(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

引数はノードドックのシグナルタブにも反映されます。

Godot4 TapTheTakarabako カスタムシグナルの宣言に追加した引数がノードドックのシグナルタブにも表示されました..

テスト

F6 キーメインのシーンを再生して、宝箱をクリックすると、お宝が放出されたタイミングで独自の otakara_spawned カスタムシグナルが発して、それを受けたメソッドによってスコアの値と表示が更新されました。
# スコアの数字が見えづらいので、背景画像を追加する予定です。

Godot4 TapTheTakarabako お宝出現のカスタムシグナルを作り、その受信側メソッドの処理を呼ぶことでスコアを加算して表示を更新できました..

スコアの桁数について

int — Godot Engine (4.x)の日本語のドキュメント」によると int の最大値は 9223372036854775807 で 19 桁なので、19 桁表示できるサイズに調整します。
現状は 18 桁だったの Font Size を 60 から 55 に下げます。

まとめ

今回は、2D / 3D ゲームを作成できる無料・オープンソースの軽快なゲームエンジン「Godot Engine 4」で、独自のシグナルと、それを受け取る受信側メソッドを作成して、お宝が出た際にスコアの値と表示を更新する実装例を紹介しました。
カスタムシグナルには引数を追加できることもわかりました。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました