Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Автоматичне і звичайне завантаження вузлів

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

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

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

GDScript supports the creation of static functions using static func. When combined with class_name, this makes it possible to create libraries of helper functions without having to create an instance to call them. The limitation of static functions is that they can't reference member variables, non-static functions or self.

Since Godot 4.1, GDScript also supports static variables using static var. This means you can now share a variables across instances of a class without having to create a separate autoload.

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

Примітка

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

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