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.

씬 노드(Scene Node)

소개

``get_node()``를 사용하여 스크립트에서 노드를 참조하는 것은 때때로 취약할 수 있습니다. UI 씬의 버튼을 한 패널에서 다른 패널로 이동하면 버튼의 노드 경로가 변경되고, 스크립트가 하드 코딩된 노드 경로와 함께 ``get_node()``를 사용하는 경우 스크립트는 더 이상 버튼을 찾을 수 없습니다.

이와 같은 상황에서는 노드를 씬 고유 노드로 전환하여 노드의 경로가 변경될 때마다 스크립트를 업데이트하지 않아도 됩니다.

프로젝트 생성하기

이렇게 하고 싶어하는 몇 가지 이유가 있습니다:

씬 트리 독에서 노드를 마우스 오른쪽 버튼으로 클릭하고 상황에 맞는 메뉴에서 **고유 이름으로 액세스**를 선택합니다.

../../_images/unique_name.webp

옵션을 선택하면 노드는 이제 씬 트리에서 해당 이름 옆에 백분율 기호(%)가 표시됩니다.

../../_images/percent.webp

이름 시작 부분에 "%"를 추가하여 노드 이름을 바꾸는 동안 이 작업을 수행할 수도 있습니다. 확인하면 이름 옆에 백분율 기호가 나타납니다.

이제 스크립트에서 노드를 사용할 수 있습니다. 예를 들어 % symbol과 노드 이름을 입력하여 get_node() 메서드 호출로 이를 참조할 수 있습니다.

get_node("%RedButton").text = "Hello"
%RedButton.text = "Hello" # Shorter syntax

동일 씬 제약

씬 고유 노드는 동일한 씬 내부의 노드에 의해서만 검색될 수 있습니다. 이 제한 사항을 설명하려면 Sword 씬을 인스턴스화하는 Player 씬 예제를 고려하세요.

../../_images/unique_name_scene_instance_example.webp

Player 스크립트 내부에서 get_node() 호출 결과는 다음과 같습니다.

  • ``get_node("%Eyes")``는 Eyes 노드를 반환합니다.

  • ``get_node("%Hilt")``는 ``null``를 반환합니다.

다음은 Sword 스크립트 내부에서 get_node() 호출의 결과입니다.

  • ``get_node("%Eyes")``는 ``null``를 반환합니다.

  • ``get_node("%Hilt")``는 Hilt 노드를 반환합니다.

스크립트가 다른 씬의 노드에 액세스할 수 있는 경우 해당 노드에서 get_node()``를 호출하여 해당 노드에서 고유 노드를 가져올 있습니다. 씬. 이는 여러 ``get_node() 호출을 방지하는 노드 경로에서도 작동합니다. 씬 고유 노드를 사용하여 Player 스크립트에서 Hilt 노드를 가져오는 두 가지 방법은 다음과 같습니다.

  • ``get_node("Hand/Sword").get_node("%Hilt")``는 Hilt 노드를 반환합니다.

  • ``get_node("Hand/Sword/%Hilt")``는 Hilt 노드도 반환합니다.

씬 고유 이름은 노드 경로 끝에서만 작동하지 않습니다. 중간에 하나의 노드에서 다른 노드로 이동하는 데 사용할 수 있습니다. 예를 들어 Sword 노드는 Player 씬에서 씬 고유 노드로 표시되므로 다음이 가능합니다.

  • ``get_node("%Sword/%Hilt")``는 Hilt 노드를 반환합니다.

대안

씬 고유 노드는 씬을 탐색하는 데 유용한 도구입니다. 그러나 다른 기술이 더 나은 경우도 있습니다.

:ref:`그룹 <doc_groups>`을 사용하면 두 개의 노드가 어디에 위치한 씬에 관계없이 다른 노드에서 노드(또는 여러 노드 그룹)를 찾을 수 있습니다.

:ref:`싱글톤(자동 로드) <doc_singletons_autoload>`는 씬에 관계없이 모든 노드에서 직접 액세스할 수 있는 항상 로드되는 노드입니다. 이는 일부 데이터나 기능이 전 세계적으로 공유될 때 유용합니다.

:ref:`노드.find_child() <class_Node_method_find_child>`는 전체 경로를 알지 못한 채 이름으로 노드를 찾습니다. 이는 씬 고유 노드와 유사해 보이지만 이 방법은 중첩된 장면에서 노드를 찾을 수 있으며 어떤 방식으로든 씬 편집기에서 노드를 표시할 필요가 없습니다. 그러나 이 방법은 속도가 느립니다. 씬 고유 노드는 Godot에 의해 캐시되고 검색 속도가 빠르지만, 메소드가 호출될 때마다 ``find_child()``는 모든 자손(모든 자식, 손자 등)을 확인해야 합니다.