🖥️
【Godot Engine】シーンをインスタンス化する時に引数を渡す方法
はじめに
この記事は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より、少ないノードで構成されているシーンの呼び出しに向いていると思います。
サンプルコード
おわりに
この方法を使えば、インスタンスの初期化を忘れることなく実行できます。
コンストラクタに引数を渡し忘れた場合、エラーが発生するので、すぐに気づくことができます。
初期化が必要なシーンをインスタンス化する際は、是非使用してみてください。
参考記事
Discussion