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

Godot пропонує функцію автоматичного завантаження вузлів у корені проєкту, що дозволяє вам отримати до них глобальний доступ, які можуть виконувати роль Singleton: Синглтони (Автозавантаження). Ці автоматично завантажені вузли не звільняються, коли ви змінюєте сцену з коду за допомогою SceneTree.change_scene.

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

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

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

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

Автозавантажені вузли можуть спростити ваш код у деяких випадках:

  • Статичні дані: якщо вам потрібні дані, призначені виключно для одного класу, наприклад бази даних, то автозавантаження може бути хорошим інструментом. У Godot не існує API скриптів для створення та управління статичними даними в іншому випадку.

  • Статичні функції: створення бібліотеки функцій, які повертають лише значення.

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

До Godot 3.1 інше використання було лише для зручності: автозавантаження мають глобальну змінну для свого імені, згенеровану в GDScript, що дозволяє вам викликати їх із будь-якого файлу скрипта у вашому проєкті. Але тепер ви можете використовувати ключове слово class_name замість того, щоб отримати автоматичне заповнення для типу у всьому вашому проєкті.

Примітка

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

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