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.

Унікальні вузли сцени

Вступ

Використання get_node() для посилання на вузли зі скрипта іноді може бути крихким. Якщо ви переміщуєте кнопку в сцені інтерфейсу користувача з однієї панелі на іншу, шлях до вузла кнопки змінюється, і якщо скрипт використовує get_node() із жорстко закодованим шляхом до вузла, скрипт не зможе знайти кнопка більше.

У подібних ситуаціях вузол можна перетворити на унікальний вузол сцени, щоб уникнути необхідності оновлювати скрипт кожного разу, коли шлях вузла змінюється.

Створення та використання

Існує два способи створення унікального вузла сцени.

У панелі дерева сцени клацніть вузол правою кнопкою миші та виберіть у контекстному меню Доступ як унікальне ім’я.

../../_images/unique_name.webp

Після вибору параметра вузол тепер матиме символ відсотка (%) біля свого імені в дереві сцени:

../../_images/percent.webp

Ви також можете зробити це під час перейменування вузла, додавши «%» на початку імені. Після підтвердження біля назви з’явиться символ відсотка.

Тепер ви можете використовувати вузол у своєму сценарії. Наприклад, ви можете посилатися на нього за допомогою виклику методу get_node(), ввівши символ %, а потім назву вузла:

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

Обмеження однієї сцени

Унікальний вузол сцени може бути отриманий лише вузлом усередині тієї самої сцени. Щоб продемонструвати це обмеження, розглянемо цей приклад сцени Гравець, яка встановлює сцену Меч:

../../_images/unique_name_scene_instance_example.webp

Ось результати викликів get_node() всередині сценарію Player:

  • get_node("%Eyes") повертає вузол Eyes.

  • get_node("%Hilt") повертає null.

Це результати викликів get_node() всередині сценарію Sword:

  • get_node("%Eyes") повертає null.

  • get_node("%Hilt") повертає вузол Hilt.

Якщо скрипт має доступ до вузла в іншій сцені, він може викликати get_node() на цьому вузлі, щоб отримати унікальні вузли сцени зі сцени цього вузла. Це також працює в шляху до вузла, що дозволяє уникнути кількох викликів get_node(). Ось два способи отримати вузол Hilt зі скрипта Player за допомогою унікальних вузлів сцени:

  • get_node("Hand/Sword").get_node("%Hilt") повертає вузол Hilt.

  • get_node("Hand/Sword/%Hilt") також повертає вузол Hilt.

Унікальні імена сцени працюють не лише в кінці шляху вузла. Їх можна використовувати в середині для переходу від одного вузла до іншого. Наприклад, вузол Меч позначено як унікальний вузол сцени в сцені Гравець, тому це можливо:

  • get_node("%Sword/%Hilt") повертає вузол Hilt.

Альтернативи

Унікальні вузли сцени є корисним інструментом для навігації сценою. Однак є ситуації, коли інші методи можуть бути кращими.

Group дозволяє знайти вузол (або групу багатьох вузлів) з будь-якого іншого вузла, незалежно від того, на якій сцені ці два вузли розташовані.

Singleton (Autoload) — це завжди завантажений вузол, до якого може отримати прямий доступ будь-який вузол незалежно від сцени. Це корисно, коли деякі дані чи функції надаються глобально.

Node.find_child() знаходить вузол за назвою, не знаючи його повного шляху. Здається, це схоже на унікальний вузол сцени, але цей метод може знаходити вузли у вкладених сценах і не вимагає жодного позначення вузла в редакторі сцени. Однак цей спосіб повільний. Унікальні вузли сцени кешуються Godot, і їх швидко отримати, але кожного разу, коли викликається метод, find_child() має перевірити кожного нащадка (кожну дитину, онука тощо).