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

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

Вы можете создать столько сцен, сколько захотите, и сохранить их на диск с расширением ''.tscn'', которое расшифровывается как «текстовая сцена». Файл ''Label.tscn'' из предыдущего урока был примером. Мы называем эти файлы «Упакованные сцены», поскольку они упаковывают информацию о содержимом вашей сцены.

Вот пример мяча. Он состоит из узла 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 и в менеджере проектов нажмите кнопку Import, чтобы импортировать проект.

../../_images/instancing_import_button.png

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

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

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

../../_images/instancing_diagram_shooter.png

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

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

Programmers tend to spend a lot of time designing abstract architectures and trying to fit components into it. Designing based on scenes makes development faster and more straightforward, allowing you to focus on the game logic itself. Because most game components map directly to a scene, using a design based on scene instantiation means you need little other architectural code.

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

../../_images/instancing_diagram_open_world.png

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

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

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

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

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

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

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

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