Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

노드와 씬 인스턴스

이 가이드에서는 노드를 가져오고, 노드를 만들고, 하위 항목으로 추가하고, 코드에서 장면을 인스턴스화하는 방법을 설명합니다.

더 보기

씬 인스턴싱에 대한 Godot의 접근 방식에 대해 알아보려면 인스턴스 만들기 튜토리얼을 확인하세요.

노드 만들기

노드.get_node() 메서드를 호출하여 노드에 대한 참조를 얻을 수 있습니다. 이것이 작동하려면 자식 노드가 씬 트리에 있어야 합니다. 상위 노드의 _ready() 기능으로 가져오면 이를 보장합니다.

예를 들어, 이와 같은 씬 트리가 있고 Sprite2D 및 Camera2D 노드에 대한 참조를 가져와 스크립트에서 액세스하려는 경우.

../../_images/nodes_and_scene_instances_player_scene_example.webp

인터페이스를 활성화하기 위해, 다음 코드를 실행합니다:

var sprite2d
var camera2d

func _ready():
    sprite2d = get_node("Sprite2D")
    camera2d = get_node("Camera2D")

유형이 아닌 이름을 사용하여 노드를 얻습니다. 위의 "Sprite2D"와 "Camera2D"는 씬의 노드 이름입니다.

../../_images/nodes_and_scene_instances_sprite_node.webp

씬 독에서 Sprite2D 노드의 이름을 Skin으로 바꾸면 스크립트에서 노드를 가져오는 줄을 ``get_node("Skin")``로 변경해야 합니다.

../../_images/nodes_and_scene_instances_sprite_node_renamed.webp

노드 경로 복사

노드에 대한 참조를 얻을 때 직접적인 하위 항목을 얻는 데만 국한되지 않습니다. get_node() 기능은 파일 브라우저로 작업할 때와 마찬가지로 경로를 지원합니다. 노드를 구분하려면 슬래시를 추가하세요.

UserInterface 노드에 스크립트가 연결된 다음 씬 예제를 살펴보겠습니다.

../../_images/nodes_and_scene_instances_ui_scene_example.webp

인터페이스를 활성화하기 위해, 다음 코드를 실행합니다:

var animation_player

func _ready():
    animation_player = get_node("ShieldBar/AnimationPlayer")

참고

파일 경로와 마찬가지로 ".."를 사용하여 상위 노드를 얻을 수 있습니다. 가장 좋은 방법은 캡슐화를 깨뜨리지 않더라도 그렇게 하지 않는 것입니다. 슬래시로 경로를 시작하여 절대 경로로 만들 수도 있습니다. 이 경우 최상위 노드는 응용 프로그램의 사전 정의된 루트 뷰포트인 "/root"가 됩니다.

구문 설탕

GDScript에서 코드를 단축하기 위해 두 가지 단축어를 사용할 수 있습니다. 첫째, 멤버 변수 앞에 @onready 주석을 넣으면 _ready() 콜백 직전에 초기화됩니다.

@onready var sprite2d = get_node("Sprite2D")

``get_node()``에 대한 짧은 표기법도 있습니다: 달러 기호 "$". 얻으려는 노드의 이름이나 경로 앞에 배치합니다.

@onready var sprite2d = $Sprite2D
@onready var animation_player = $ShieldBar/AnimationPlayer

노드 만들기

다른 클래스 기반 데이터 유형과 마찬가지로, 코드로 노드를 만들려면 .new() 메서드를 호출해야 합니다. 예를 들어:

새로 생성된 노드의 참조를 변수에 저장하고 ``add_child()``를 호출하여 스크립트를 연결한 노드의 하위 항목으로 추가할 수 있습니다.

var sprite2d

func _ready():
    sprite2d = Sprite2D.new() # Create a new Sprite2D.
    add_child(sprite2d) # Add it as a child of this node.

노드를 삭제하고 메모리에서 해제하려면 해당 queue_free() 메서드를 호출하면 됩니다. 이렇게 하면 처리가 완료된 후 현재 프레임 끝에서 삭제를 위해 노드가 대기열에 추가됩니다. 이 시점에서 엔진은 씬에서 노드를 제거하고 메모리에서 개체를 해제합니다.

sprite2d.queue_free()

``sprite2d.queue_free()``를 호출하기 전의 원격 씬 트리는 다음과 같습니다.

../../_images/nodes_and_scene_instances_remote_tree_with_sprite.webp

엔진이 노드를 해제한 후 원격 씬 트리는 더 이상 스프라이트를 표시하지 않습니다.

../../_images/nodes_and_scene_instances_remote_tree_no_sprite.webp

또는 ``free()``를 호출하여 노드를 즉시 삭제할 수도 있습니다. 이에 대한 참조는 즉시 ``null``가 되므로 주의해서 수행해야 합니다. 수행 중인 작업을 잘 모르는 경우에는 ``queue_free()``를 사용하는 것이 좋습니다.

노드를 해제하면 해당 자식 노드도 모두 해제됩니다. 덕분에 씬 트리의 전체 분기를 삭제하려면 최상위 상위 노드만 해제하면 됩니다.

씬 인스턴스화하기

장면은 원하는 만큼 복제물을 만들 수 있는 템플릿입니다. 이 작업을 인스턴스화라고 하며 코드에서 수행하는 작업은 두 단계로 이루어집니다.

  1. 코드에서 리소스 불러오기

  2. 씬의 인스턴스를 얻으려면 PackedScene.instance() 메서드를 사용해야 합니다.

var scene = load("res://my_scene.tscn")

컴파일러가 런타임 시가 아니라 스크립트를 읽을 때 로드 작업이 발생하므로 씬을 미리 로드하면 사용자 경험이 향상될 수 있습니다. 이 기능은 GDScript에서만 사용할 수 있습니다.

var scene = preload("res://my_scene.tscn")

그러나 은 아직 노드가 아닙니다. 씬은 PackedScene이라는 특수 리소스에 패키징되어 있습니다. 실제 노드를 만들려면 PackedScene.instance() 함수를 호출해야 합니다. 그러면 PackedScene은 작동중인 씬에 추가할 수 있는 노드 트리를 반환합니다:

var instance = scene.instantiate()
add_child(instance)

이 두 단계 처리는 PackedScene이 불러온 상태로 유지되고 언제나 사용될 준비가 되어 있다는 장점이 있습니다. 이렇게 해서 인스턴스를 원하는 만큼 만들 수 있습니다. 이는 특히 활성 씬에서 많은 적, 총알, 그 외 다른 개체를 신속하게 인스턴스화하는 데 유용합니다.