シグナルは、開発を楽にする、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での開発では、ぜひ、シグナルを使いこなしてください!!。
コメント