Up to date

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

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

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

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.

Вот пример мяча. Он состоит из узла RigidBody2D в качестве корня с именем Ball, который позволяет мячу падать и отскакивать от стен, узла Sprite2D и узла CollisionShape2D.

../../_images/instancing_ball_scene.png

После сохранения сцены она работает как шаблон: вы можете воспроизводить ее в других сценах столько раз, сколько захотите. Воспроизведение объекта из шаблона таким образом называется созданием экземпляра (инстансированием, instancing).

../../_images/instancing_ball_instances_example.png

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

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

На практике

Давайте воспользуемся созданием экземпляров (инстансированием) на практике, чтобы увидеть, как именно оно работает в Godot. Загрузим пример проекта мяча, который мы подготовили для вас: instancing.zip.

Распакуйте архив на своём компьютере. Для его импорта вам потребуется Менеджер Проектов. Менеджер Проектов доступен при открытии Godot, либо, если вы уже открыли Godot, кликните на Проект -> Выйти в список проектов (Project -> Quit to Project List) (Ctrl + Shift + Q, Ctrl + Option + Cmd + Q на macOS)

В Менеджере Проектов нажмите кнопку 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. Главная сцена должна открыться автоматически. Если вместо основной сцены вы видите пустую 3D сцену, кликните на кнопку 2D в верхней части экрана.

../../_images/instancing_2d_scene_select.webp ../../_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 (Cmd + B на macOS). Вы должны увидеть, как он падает.

Теперь мы хотим создать больше экземпляров узла Ball. Когда шар все ещё выделен, нажмите Ctrl-D (Cmd-D на macOS), чтобы вызвать команду дублирования. Щелкните и перетащите, чтобы переместить новый шар в другое место.

../../_images/instancing_ball_duplicated.png

Вы можете повторять этот процесс до тех пор, пока в сцене не появятся несколько.

../../_images/instancing_main_scene_with_balls.png

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

Редактирование сцен и экземпляров

И это ещё не всё. С помощью этой особенности вы можете:

  1. Изменить свойства одного шара, не затрагивая другие, с помощью Инспектора.

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

Примечание

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

Let's try this. Open ball.tscn and select the Ball node. In the Inspector on the right, click on the PhysicsMaterial property to expand it.

../../_images/instancing_physics_material_expand.webp

Установите свойство Отскакивание (Bounce) в 0.5, щелкнув по полю с цифрами, введя 0.5 и нажав Enter.

../../_images/instancing_property_bounce_updated.webp

Play the game by pressing F5 (Cmd + B on macOS) and notice how all balls now bounce a lot more. As the Ball scene is a template for all instances, modifying it and saving causes all instances to update accordingly.

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

../../_images/instancing_scene_tabs.png

Выберите один из экземпляров узла Ball и в инспекторе установите значение Gravity Scale равным 10.

../../_images/instancing_property_gravity_scale.png

Рядом с измененным свойством появится серая кнопка «Вернуть».

../../_images/instancing_property_revert_icon.png

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

Запустите игру заново и обратите внимание, что теперь этот шарик падает гораздо быстрее остальных.

Примечание

You may notice you are unable to change the values of the PhysicsMaterial of the ball. This is because PhysicsMaterial is a resource, and needs to be made unique before you can edit it in a scene that is linking to its original scene. To make a resource unique for one instance, right-click on it in the Inspector and click Make Unique in the contextual menu.

Ресурсы - это ещё один важный компонент игры Godot, о котором мы расскажем в одном из последующих уроков.

Экземпляры сцены как язык дизайна

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

При создании игр с Godot мы рекомендуем отказаться от архитектурных шаблонов кода, таких как Model-View-Controller (MVC) или диаграммы Entity-Relationship. Вместо этого вы можете начать с того, чтобы представить себе элементы, которые игроки увидят в вашей игре, и структурировать код вокруг них.

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

../../_images/instancing_diagram_shooter.png

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

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

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

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

../../_images/instancing_diagram_open_world.png

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

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

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

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

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

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

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

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