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 пропонує функцію автоматичного завантаження вузлів у корені вашого проекту, що дозволяє отримати до них глобальний доступ, які можуть виконувати роль синглетону: Синглтони (автозавантаження). Ці автозавантажені вузли не звільняються, коли ви змінюєте сцену з коду за допомогою SceneTree.change_scene_to_file.

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

Вирішення аудіо проблем

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

Наприклад, припустимо, ми будуємо платформер і хочемо збирати монети, які відтворюють звуковий ефект. Для цього є вузол: AudioStreamPlayer. Проте якщо ми викликаємо AudioStreamPlayer в час, коли він вже відтворює звук, новий звук перериває перший.

Рішення полягає у написанні глобального, автозавантажуваного класу звукового менеджера. Він генерує пул вузлів AudioStreamPlayer, які циклічно переглядаються при кожному новому запиті на звукові ефекти. Скажімо, ми називаємо цей клас Sound, і ви можете використовувати його з будь-якого місця у вашому проекті, викликавши Sound.play("coin_pickup.ogg"). Це вирішує проблему в короткостроковій перспективі, але створює більше проблем:

  1. Глобальний стан: один об’єкт тепер відповідає за дані всіх об’єктів. Якщо клас Sound має помилки, або не має AudioStreamPlayer, усі вузли, що викликають його, можуть зламатися.

  2. Глобальний доступ: тепер, коли будь-який об’єкт може викликати Sound.play(sound_path) з будь-якого місця, більше не існує простого способу знайти джерело помилки.

  3. Глобальний розподіл ресурсів: за допомогою пулу вузлів AudioStreamPlayer, що зберігається з самого початку, ви можете мати занадто мало помилок і стикатися з ними, або занадто багато і використовувати більше пам'яті, ніж вам потрібно.

Примітка

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

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

Порівняйте це з тим, коли кожна сцена зберігає в собі стільки вузлів AudioStreamPlayer, скільки їй потрібно, і всі ці проблеми зникають:

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

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

  3. Кожна сцена розподіляє точно необхідну кількість ресурсів.

Керування спільною функціональністю чи даними

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

У випадку функцій ви можете створити новий тип Node, який надає цю функцію для окремої сцени за допомогою class_name ключове слово в GDScript.

Що стосується даних, то ви можете:

  1. Створити новий тип Resource для спільного використання даних.

  2. Зберігати дані в об'єкті, до якого має доступ кожен вузол, наприклад, використовуючи властивість owner для доступу до кореневого вузла сцени.

Коли слід використовувати автозавантаження

GDScript підтримує створення static функцій за допомогою static func. У поєднанні з class_name це дає змогу створювати бібліотеки допоміжних функцій без необхідності створювати екземпляр для їх виклику. Обмеження статичних функцій полягає в тому, що вони не можуть посилатися на змінні-члени, нестатичні функції або self.

Починаючи з Godot 4.1, GDScript також підтримує static змінні за допомогою static var. Це означає, що тепер ви можете спільно використовувати змінні в екземплярах класу без необхідності створювати окреме автозавантаження.

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

Примітка

Автозавантаження не обов'язково є одиничним. Ніщо не заважає вам створювати копії автозавантажуваного вузла. Автозавантаження - це лише інструмент, за допомогою якого вузол автоматично завантажується як дочірній елемент кореня вашого дерева сцен, незалежно від структури вузлів вашої гри або від того, яку сцену ви запускаєте, наприклад, натисканням клавіш F6.

У результаті ви можете отримати вузол автозавантаження, наприклад, вузол із назвою Sound, за допомогою виклику get_node("/root/Sound").