Створення екземплярів

У попередній частині ми бачили, що сцена — це набір вузлів, організованих у структуру дерева, з одним вузлом як коренем. Ви можете розділити свій проект на будь-яку кількість сцен. Ця функція допоможе вам розбити та організувати різні компоненти вашої гри.

Ви можете створити скільки завгодно сцен і зберегти їх з розширенням .tscn, що означає "текстова сцена". Як наприклад Label.tscn з попереднього завдання. Ми називаємо ці файли «Packed Scene», вони описують вміст вашої сцени.

Ось приклад м’яча. Він складається з RigidBody2D як його кореня під назвою Ball, що дозволяє м’ячу падати та відскакувати від стін, Sprite та CollisionShape2D.

../../_images/instancing_ball_scene.png

Після збереження сцени вона працює як шаблон: ви можете відтворювати її в інших сценах скільки завгодно разів. Відтворення об’єкта з такого шаблону називається instancing.

../../_images/instancing_ball_instances_example.png

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

Кожен екземпляр сцени Ball починається з тієї ж структури та властивостей, що й Ball.tscn. Однак ви можете змінювати кожен окремо, наприклад змінювати, як вони відскакують, наскільки вони важкі, або будь-яку властивість, доступну для вихідної сцени.

На практиці

Давайте спробуємо це на практиці, щоб побачити, як це працює саме в Godot. Ми пропонуємо вам завантажити зразок проекту м’яча, який ми підготували для вас: instancing.zip.

Розпакуйте архів на комп’ютері. Потім відкрийте Godot і в диспетчері проектів натисніть кнопку Імпорт, щоб імпортувати проект.

../../_images/instancing_import_button.png

У спливаючому вікні, що з’явиться, натисніть кнопку огляду та перейдіть до теки, яку ви розпакували.

../../_images/instancing_import_browse.png

Двічі клацніть файл project.godot, щоб відкрити його.

../../_images/instancing_import_project_file.png

Нарешті, натисніть кнопку Імпорт і редагування.

../../_images/instancing_import_and_edit_button.png

Проект містить дві упаковані сцени: Main.tscn, що містить стіни, з якими м'яч стикається, і Ball.tscn. Основна сцена має відкритися автоматично.

../../_images/instancing_main_scene.png

Додамо м'яч як дочірній вузол Main. У панелі «Сцена» виберіть головний вузол. Потім клацніть значок зв'язування у верхній частині панелі сцени. Ця кнопка дозволяє вам додати екземпляр сцени як дочірній для поточного вибраного вузла.

../../_images/instancing_scene_link_button.png

Двічі клацніть сцену з м’ячем, щоб створити її екземпляр.

../../_images/instancing_instance_child_window.png

М'яч з’явиться у верхньому лівому куті вікна перегляду.

../../_images/instancing_ball_instanced.png

Клацніть на ньому та перетягніть його до центру перегляду.

../../_images/instancing_ball_moved.png

Запустіть гру, натиснувши F5. Ви повинні побачити, як він падає.

Тепер ми хочемо створити більше екземплярів вузла Ball. Коли м'яч все ще виділений, натисніть Ctrl-D (Cmd-D у macOS), щоб викликати повторювану команду. Натисніть і перетягніть, щоб перемістити новий м’яч в інше місце.

../../_images/instancing_ball_duplicated.png

Ви можете повторювати цей процес, поки у сцені не з’явиться кілька м'ячів.

../../_images/instancing_main_scene_with_balls.png

Запустіть гру ще раз. Тепер ви повинні бачити, як кожен м'яч падає незалежно один від одного. Це те, що роблять екземпляри. Кожен є самостійним відтворенням шаблонної сцени.

Редагування сцен і екземплярів

Є ще багато про екземпляри. Ця особливість дозволяє:

  1. Змініть властивості однієї кулі, не впливаючи на інші за допомогою Інспектора.

  2. Змініть властивості за замовчуванням для кожного м'яча. Відкрийте сцену Ball.tscn і внесіть зміни до вузла Ball. Після збереження сцени значення всіх екземплярів Ball у проекті оновляться.

Примітка

Зміна властивості екземпляра завжди перевизначає значення з відповідної упакованої сцени.

Давайте спробуємо це. Відкрийте Ball.tscn і виберіть вузол Ball. У Інспекторі праворуч клацніть властивість PhysicsMaterial, щоб розгорнути її.

../../_images/instancing_physics_material_expand.png

Встановіть його властивість Bounce на 2, клацнувши числове поле, ввівши 2 та натиснувши Enter.

../../_images/instancing_property_bounce_updated.png

Запустіть гру, натиснувши F5, і ви помітите, як тепер усі м’ячі відскакують набагато більше. Оскільки сцена Ball є шаблоном для всіх екземплярів, її зміна та збереження призведе до відповідного оновлення всіх екземплярів.

Тепер налаштуємо окремий екземпляр. Поверніться до основної сцени, натиснувши відповідну вкладку над вікном перегляду.

../../_images/instancing_scene_tabs.png

Виберіть один із створених вузлів Ball і в Інспекторі встановіть його значення Gravity Scale на 10.

../../_images/instancing_property_gravity_scale.png

Поруч зі зміненою властивістю з’являється сіра кнопка «Повернути».

../../_images/instancing_property_revert_icon.png

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

Запустіть гру знову і зверніть увагу, що цей м’яч тепер падає набагато швидше за інші.

Примітка

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

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

Екземпляри сцен як мова дизайну

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

Ми рекомендуємо відмовитися від шаблонів архітектурного коду під час створення ігор з Godot, наприклад, діаграми модель-вигляд-контролер (MVC) або діаграми сутність-відношення. Замість цього ви можете почати з уявлення елементів, які гравці побачать у вашій грі, і структурувати ваш код навколо них.

Наприклад, ви можете розбити гру-шутер так:

../../_images/instancing_diagram_shooter.png

Ви можете створити подібну схему майже для будь-якої гри. Кожен прямокутник представляє об’єкт, який видно в грі з точки зору гравця. Стрілки вказують на зв'язок сцен між собою.

Після того як ви намалюєте таку діаграму, ми рекомендуємо створити сцени для кожного елемента, присутнього на діаграмі. Ви будете використовувати створення екземплярів (чи в коді, чи безпосередньо в редакторі) для побудови дерева сцен.

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

Ось приклад діаграми сцени для гри з відкритим світом з безліччю ресурсів і вкладених елементів:

../../_images/instancing_diagram_open_world.png

Уявіть, що ми почали зі створення кімнати. Ми могли б зробити кілька різних сцен кімнат з унікальним розташуванням меблів. Пізніше ми могли б створити сцену будинку, яка використовує декілька екземплярів кімнати для інтер’єру. Ми створили б цитадель з багатьох екземплярів будинків і великої місцевості, на якій ми б розмістили цитадель. Кожна з них буде сценою, що містить одну або кілька підсцен.

Пізніше ми могли б створити сцени, що представляють охорону, і додати їх до цитаделі. Вони будуть опосередковано додані до загального світу гри.

З Godot легко відтворити гру, схожу на цю, адже все, що вам потрібно зробити, це створити сцени та створити більше екземплярів сцен. Крім того, інтерфейс редактора побудований так, щоб ним було зручно користуватися, як програмістам, так і не програмістам. Типовий склад команди розробки може залучати 2D або 3D художників, дизайнерів рівнів, дизайнерів ігор та аніматорів і всі вони можуть працювати з інтерфейсом редактора.

Підсумок

Процес створення екземпляра об’єкта з креслення має багато зручних застосувань. Зі сценами це дає вам:

  • Можливість розділити гру на повторно використовувані компоненти.

  • Інструмент для структурування та інкапсуляції складних систем.

  • Можливість продумати структуру вашого ігрового проекту природним чином.