【Godot4】signalを使いこなそう!【最重要!!】

シグナルは、開発を楽にする、Godot4の肝!!

Godotには、開発を手助けする、便利な機能が多数用意されています。

その中でも、

「これを知っているのと、知らないのでは、開発スピードが段違い!!」

という機能が、

”シグナル(signal)”

です。

シグナルのここが便利。

プログラムを組む際に考えなければならない事のひとつが

「依存関係」

です。

どのプログラムが、どのプログラムと、どのような関係を結んでいるかを考えながら組んでいかないと、規模が大きくなるにつれ、プログラムが支離滅裂になってしまいます。

ただ、この「依存関係」を厳密に守ろうとすると、簡単な処理でさえ、とんでもなく面倒くさいものになりがちなのも「プログラムあるある」ではないでしょうか?(わたしだけ?)。

これを簡単に解決してくれる機能がシグナルになります。

シグナルを使用すれば、何かの処理が終わったり、何かの状態が変わった時に、その事を他のノードに、簡単に知らせることができるため、プログラムをシンプルにすることが可能になります。

Godotが用意している、シグナルを使用する

Godotには、数多くのタイプのノードが用意されていて、さらにそれぞれのノードに様々なシグナルが用意されています。

その中でも代表的なものをいくつか紹介します

1.pressed(Button)

ボタンノード(Button)には、ボタンが押されたことを知らせるシグナル”pressed”が用意されています。

ボタンノードの使用方法は、↓の記事を参照してください。

2.timeout(Timer)

ゲーム内の時間を管理するノードで、簡単に使用できるように工夫されているものがタイマーノード(Timer)です。

Timerには、設定した時間が経過したことを知らせる”timeout”が用意されています。

タイマーノードの使用方法は、↓の記事を参照してください。

カスタムシグナルを送信(発火)する

このように、便利なシグナルですが、ノードが用意したものだけでなく、自分で作成したソース内で設定することで、より便利に使う事ができます。

その方法は、「ソース内で“signal”で変数を宣言する」だけで、可能です。

signal finished #これだけでOK!!

それでは、使い方を詳しく説明していきます。

1.準備

まずは、以下のように、ノードを作成してください。

2.シグナルの設定

send.gd に以下の一文を追加してください。

extends Node2D

signal changed #←この一行を追加

これで、シグナル”changed”が、使用できます。

3.シグナルを使用

send.gdの_readyメソッドを以下のように変更します。

func _ready() -> void:
	# 1秒後にシグナルを発火
	await get_tree().create_timer(1.0).timeout
	changed.emit() #←シグナル発火メソッド

シグナルに用意されているメソッド

“emit”

でシグナルを送信(発火)します。

これで、プログラム起動して、1秒後にchangedシグナルを発火するようになります。

Godotの機能を使用したシグナル受信の設定

Sendノードを選択して、ノードドック内の”シグナル”を選択すると、

作成したシグナル”changed”が、使用できることが、確認できます。

この”changed”シグナルをダブルクリックして、シグナルを受信するReceiveノードを設定します。

receive.gdに”_on_send_changed()”という、メソッドができますので、これを以下のように設定します。

func _on_send_changed():
	print("Received signal from Send:")

これで、プログラムを起動すると、1秒後に、コンソールに

“Received signal from Send:”

と表示されるようになります。

ソースでのシグナル受信の設定

受信の設定は、プログラムソースで行うこともできます。

プログラムソースで設定することで、より細かな設定を行う事が可能です。

その方法は、シグナルのメソッド”connect”を、受信側の”_ready”メソッド内で使用することで、可能になります。

func _ready() -> void:
	var send_node = $Send
	#changedシグナル受信で、"_on_send_changed"メソッドを起動
	send_node.changed.connect(_on_send_changed)

引数有りシグナルの設定

シグナルは、引数を設定する事も可能で、引数の値を受信側に渡すことができます。

この機能を使用することで、プログラムが、より組みやすくなります。

1.引数有りシグナルの設定

send.gdのシグナル宣言部分を、以下のように変更してください。

extends Node2D

signal changed(new_value) #←この一行を変更

2.引数有りシグナルの使用

_readyメソッド内のシグナル発火部分を以下のように変更します。

func _ready() -> void:
	# 1秒後にシグナルを発火
	await get_tree().create_timer(1.0).timeout
	changed.emit("Hello from Send!") #←引数有りで、シグナル発火

3.引数有りシグナル受信の設定

Godotの機能による設定も、ソースコードによる設定も、変更点はありません。

4.引数有りシグナル受信メソッドの設定

受信側のreceive.gdに設定した、シグナル受信時のメソッド”_on_send_changed”を、以下のように変更します。

func _on_send_changed(new_value): #←引数有りに設定
	print("Received signal from Send:", new_value)

このプログラムを起動すると、1秒後に、コンソールに

“Received signal from Send:Hello from Send!”

と表示されるようになります。

このように、Godotにおけるシグナルは、非常に便利なものになっています。

Godotでの開発では、ぜひ、シグナルを使いこなしてください!!。

コメント

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