Создание экземпляров

В предыдущей части мы увидели, что сцена - это набор узлов, организованных в древовидную структуру, корнем которой является один узел. Вы можете разделить свой проект на любое количество сцен. Эта функция поможет вам разбить и организовать различные компоненты вашей игры.

You can create as many scenes as you'd like and save them as files with the .tscn extension, which stands for "text scene". The Label.tscn file from the previous lesson was an example. We call those files "Packed Scenes" as they pack information about your scene's content.

Here's an example of a ball. It's composed of a RigidBody2D node as its root named Ball, which allows the ball to fall and bounce on walls, a Sprite node, and a CollisionShape2D.

../../_images/instancing_ball_scene.png

Once you saved a scene, it works as a blueprint: you can reproduce it in other scenes as many times as you'd like. Replicating an object from a template like this is called instancing.

../../_images/instancing_ball_instances_example.png

Как мы упоминали в предыдущей части, наследованные сцены ведут себя как узел: редактор скрывает их содержимое по умолчанию. При экземпляре Ball отображается только узел Ball. Обратите внимание, что каждый дубликат имеет уникальное имя.

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

На практике

Let's use instancing in practice to see how it works in Godot. We invite you to download the ball's sample project we prepared for you: instancing.zip.

Распакуйте архив на своем компьютере. Затем откройте Godot и в менеджере проектов нажмите кнопку Import, чтобы импортировать проект.

../../_images/instancing_import_button.png

В появившемся всплывающем окне нажмите кнопку Browse и перейдите к папке, которую вы извлекли.

../../_images/instancing_import_browse.png

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

../../_images/instancing_import_project_file.png

Наконец, нажмите кнопку Import & Edit button (Импорт и редактирование).

../../_images/instancing_import_and_edit_button.png

Проект содержит две упакованные сцены: Main.tscn, содержащую стены, о которые ударяется мяч, и Ball.tscn. Главная сцена должна открыться автоматически.

../../_images/instancing_main_scene.png

Добавим шар в качестве дочернего элемента узла Main. В панели Scene выберите узел Main. Затем щёлкните значок ссылки в верхней части панели Scene. Эта кнопка позволяет добавить экземпляр сцены в качестве дочернего узла выбранного в данный момент узла.

../../_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. Change the default properties of every Ball by opening the Ball.tscn scene and making a change to the Ball node there. Upon saving, all instances of the Ball in the project will see their values update.

Примечание

Изменение свойства экземпляра всегда переопределяет значения из соответствующей упакованной сцены.

Давайте попробуем это сделать. Откройте 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 мы рекомендуем отказаться от архитектурных шаблонов кода, таких как Model-View-Controller (MVC) или диаграммы Entity-Relationship. Вместо этого вы можете начать с того, чтобы представить себе элементы, которые игроки увидят в вашей игре, и структурировать код вокруг них.

Например, вот как можно представить себе простой шутер:

../../_images/instancing_diagram_shooter.png

Подобную диаграмму можно придумать практически для любого типа игры. Каждый прямоугольник представляет сущность, которая видна в игре с точки зрения игрока. Стрелки указывают, какая сцена чем владеет.

После того как у вас есть диаграмма, мы рекомендуем создать сцену для каждого элемента, перечисленного в ней, чтобы разработать свою игру. Для построения дерева сцен вы будете использовать инстансинг, либо с помощью кода, либо непосредственно в редакторе.

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

Вот пример диаграммы сцены для игры с открытым миром с множеством ресурсов и вложенных элементов:

../../_images/instancing_diagram_open_world.png

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

Позже мы можем создать сцены, которые представляют собой охранников (и других NPC) и добавить их в нашу крепость. В результате, они будут косвенно добавлены в общий игровой мир.

С помощью Godot можно легко итерационно дорабатывать игру, ведь все, что вам нужно, - это создавать и инстанцировать новые сцены. Мы разработали редактор так, чтобы он был доступен и программистам, и дизайнерам, и художникам. В типичном процессе командной разработки могут участвовать 2D или 3D художники, дизайнеры уровней, гейм-дизайнеры и аниматоры, и все они работают с редактором Godot.

Подведение итогов

Например, процесс создания объекта по чертежу имеет множество полезных применений. Со сценами это дает вам:

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

  • Инструмент для структурирования и инкапсуляции сложных систем.

  • Язык, позволяющий думать о структуре вашего игрового проекта естественным образом.