今回は、Godotでゲーム開発を行う際に頻繁に利用する「シグナル」について紹介したいと思います。
【Godot Engine】シグナルについて初心者向けに解説!
Godot のシグナル(Signal)はノード間のやり取り(イベント)をスムーズに行うための仕組みです。
「あるノードが何かをしたら、それを別のノードに通知する」という形で使います。
-
ボタンが押されたら、キャラクターがジャンプする
-
敵が倒されたら、スコアを増やす
-
プレイヤーがゴールに到達したら、ゲームクリア画面を表示する
こういったイベント処理に「シグナル」を使います。
1. シグナルの仕組み
シグナルは 「発信する側」 と 「受信する側」 で成り立っています。
-
発信する側(シグナルを送る)
-
何かのイベントが発生したときに、シグナルを送る。
-
-
受信する側(シグナルを受け取る)
-
受け取ったら、決められた処理を実行する。
-
シグナルを使った例
それでは、例としてボタンを押したらプレイヤーがジャンプする処理をシグナルを使って実装したいと思います。
下準備として、ステージ上にSophiaを配置している状態から進めます。私の環境と同じ状態から始めたい場合には前回の記事を参考にしてください。
別に同じようにしなくても、ステージ上に何かしらのプレイヤーが存在する状態ならOKです。
ステージ上の子ノードとしてButtonノードを配置します。
Buttonを選択した状態で右側のノードタブへ進んで「pressed()」のシグナルを開きます。
プレイヤーをボタンにてジャンプさせたいので、スクリプトがアタッチされているプレイヤーを接続先とします。
スクリプトを作成する
extends CharacterBody3D
func jump():
print("ジャンプ!") # 実際のゲームではジャンプ処理を入れる
func on_button_pressed():
jump() # ボタンが押されたらジャンプする
シグナルを接続したら、「func on_button_pressed():」という関数がスクリプトの中に自動的に記述されているかと思います。
この関数は、ボタンが押されたら実行する関数です。プレイヤースクリプトはこのシグナルを受信することで、対象の処理を行います。
今回は、jumpというジャンプ処理用の関数を作ってボタンが押されたらデバッグに「ジャンプ」と表示するようにします。
ゲームを実行すると御覧のようになるかと思います。
本来なら、ジャンプ処理の中に実際のプレイヤーの動きだったりアニメーションの再生だったりを行う感じですね。
スクリプトからシグナルを作る
シグナルは、スクリプトから作ることも出来ます。
例として「敵が倒されたらスコアを増やす」といった処理で解説します。
①シグナルを作る(敵側)
敵が倒されたときにenemy_defeatedというシグナルを発信します。
extends Node3D
signal enemy_defeated # シグナルを作成
func die():
print("敵が倒された!")
enemy_defeated.emit() # シグナルを発信
queue_free() # 敵を削除
②シグナルを接続(スコア管理ノード側)
スコア管理ノードにて、敵のノードを取得してシグナルを接続します。
シグナルを受信したらスコアを加算します。
extends Node
var score = 0
func _ready():
var enemy = get_node("../Enemy") # 敵のノードを取得
enemy.enemy_defeated.connect(_on_enemy_defeated) # シグナルを接続
func _on_enemy_defeated():
score += 100
print("スコア:", score)
「emit()」で発信する
「connect()」で受信する
エディタからもスクリプトからも設定可能
これでノード同士をスムーズにつなげることができるので、複雑な処理がシンプルに書くことが出来ます。
Godotの開発において非常によく使う機能ですので、是非活用してください。