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

Вступ

Використання 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() має перевірити кожного нащадка (кожну дитину, онука тощо).