Унікальні вузли сцени
Вступ
Використання get_node() для посилання на вузли зі скрипта іноді може бути крихким. Якщо ви переміщуєте кнопку в сцені інтерфейсу користувача з однієї панелі на іншу, шлях до вузла кнопки змінюється, і якщо скрипт використовує get_node() із жорстко закодованим шляхом до вузла, скрипт не зможе знайти кнопка більше.
У подібних ситуаціях вузол можна перетворити на унікальний вузол сцени, щоб уникнути необхідності оновлювати скрипт кожного разу, коли шлях вузла змінюється.
Створення та використання
Існує два способи створення унікального вузла сцени.
У панелі дерева сцени клацніть вузол правою кнопкою миші та виберіть у контекстному меню Доступ як унікальне ім’я.
Після вибору параметра вузол тепер матиме символ відсотка (%) біля свого імені в дереві сцени:
Ви також можете зробити це під час перейменування вузла, додавши «%» на початку імені. Після підтвердження біля назви з’явиться символ відсотка.
Тепер ви можете використовувати вузол у своєму сценарії. Наприклад, ви можете посилатися на нього за допомогою виклику методу get_node(), ввівши символ %, а потім назву вузла:
get_node("%RedButton").text = "Hello"
%RedButton.text = "Hello" # Shorter syntax
GetNode<Button>("%RedButton").Text = "Hello";
Обмеження однієї сцени
Унікальний вузол сцени може бути отриманий лише вузлом усередині тієї самої сцени. Щоб продемонструвати це обмеження, розглянемо цей приклад сцени Гравець, яка встановлює сцену Меч:
Ось результати викликів 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() має перевірити кожного нащадка (кожну дитину, онука тощо).