🖥️

【Godot Engine】シーンをインスタンス化する時に引数を渡す方法

2022/12/20に公開

はじめに

この記事はGodot Engine Advent Celendar 2022の20日目の記事です。

C#などのプログラミング言語ではインスタンスを生成する時に引数を渡すことができますが、
Godot Engineではシーンのインスタンスを生成する時に引数を渡すことができません。
この記事では、擬似的に引数を渡しながらシーンをインスタンス化して呼び出す方法を紹介します。

方法1:シーンを呼び出すクラスを中継する

Main.gd
extends Node2D

func _ready():
    var call:Calling = Calling.new(Vector2(100,100),"test")
    add_child(call.instance)
Calling.gd
class_name Calling
const Scene_file = preload("res://Scene.tscn")
var instance:Node2D

func _init(position:Vector2, value:String):
    instance = Scene_file.instantiate()
    instance.position = position
    instance.text = value
Scene.gd
extends Node2D
@onready var Label_node:Label = $Label
var text:String

func _ready():
    Label_node.text = self.text

Main.gdからScene.tscnを呼び出そうとする例です。
Scene.tscnの初期化をするための専用クラスであるCalling.gdを作成し、
擬似的にコンストラクタにてScene.tscnの初期化を可能にしています。

方法2:gdファイルからシーンを呼び出す

Main2.gd
extends Node2D

func _ready():
    var scene:Scene2 = Scene2.new(Vector2(100,100),"test")
    add_child(scene)
Scene2.gd
extends Node2D
class_name Scene2
var label:Label

func _init(position:Vector2, value:String):
    label = Label.new()
    label.position = position
    label.text = value
    var theme = Theme.new()
    theme.default_font_size = 50
    label.theme = theme
    add_child(label)

Main2.gdからScene2.gdを呼び出しています。
ノードとなる要素を継承することで.gdファイル自体をシーンとして呼び出せるようになります。
.tscnファイルと違い、スクリプト内にてプロパティの変更が必要です。
方法1より、少ないノードで構成されているシーンの呼び出しに向いていると思います。

サンプルコード

https://github.com/gurencrize/InstantiationTest

おわりに

この方法を使えば、インスタンスの初期化を忘れることなく実行できます。
コンストラクタに引数を渡し忘れた場合、エラーが発生するので、すぐに気づくことができます。
初期化が必要なシーンをインスタンス化する際は、是非使用してみてください。

参考記事

https://zenn.dev/kawaxumax/articles/9546778bc526d7#はじめに
https://godotengine.org/qa/29943/passing-arguments-to-root-node-when-instancing-a-scene

Discussion