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が間に合わないのか早すぎるのかシーン内に追加されませんでした。フレームをずらすとうまくいくとか原始的ですが、できれば原因の究明を早く行いたい。
コメント