Godotでシーンをインスタンス化して別のインスタンスでシグナルを受け取る方法

GodotでなんらかのGeneratorとゲームマネージャーなどのスクリプトが異なる場合、作られたインスタンスのシグナルを受け渡すための仲介処理が必要になります。以前は作った本人と直接シグナルを接続する方法でしたが、今度は間接的に接続を試みます。

目次

emit_signalを使って接続

作るものは上記リンク同様にボタンが押された時にログを表示するものです。変更点としてはhud.gdで直接ボタンのシーンをインスタンス化するのではなく、generatorシーンとgenerator.gdを経由して作成します。

シーン

HUDシーンの中にgeneratorシーンを作成します。

generatorシーンは空っぽで構いませんが、スクリプトを1つ追加しておいてください

generator.gdスクリプト

generatorスクリプトではスペースキーを押すとボタンをインスタンス化します。また、インスタンス化したシグナルを送信します。これは後ほどhud.gdに連絡をします。

extends Control

signal button_create(button_instance)
var button_scene = preload("res://other_button.tscn")

func _process(delta):
	if Input.is_action_just_pressed("ui_accept") :
		var button_instance = button_scene.instantiate()
		emit_signal("button_create",button_instance)
スライム

_readyでシグナルを送信すると、インスタンス化されたボタンをadd_child出来ないことがあります。

hud.gdにシグナルを接続

generatorノードを選択し、ノードビューに切り替えるとbutton_createシグナルを接続することが出来ます。

選択後、接続を行ってhud.gdに接続を行います。デフォルトのままだとメソッド名は「_on_generator_button_create」となると思います。

hudスクリプトを修正

変更点としては以前の作成する部分をカットして、以下のメソッド内を修正。インスタンスをhudスクリプトで作る必要がなく、ゲームに必要な処理に専念できる形になります。

func _on_generator_button_create(button_instance):
	add_child(button_instance)
	
	var button_node = button_instance.find_child("Button")
	button_node.connect("button_down",_on_button_button_down.bind())

func _on_button_button_down():
	print("ボタンが押されました")

動かして確認

あとは動かしてみて以下を確認

  • スペースキーを押すとボタンが作られる
  • ボタンを押すと「ボタンが押されました」のログが表示される

うまく行かない場合、引数を渡していなかったり、実行するシーンを間違えている場合があります。私の場合、スペースキーで作成する部分をgeneratorの_readyで行うとhud.gdでのadd_childが間に合わないのか早すぎるのかシーン内に追加されませんでした。フレームをずらすとうまくいくとか原始的ですが、できれば原因の究明を早く行いたい。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次