Создание экземпляров
Примечание
Этот урок относится к созданию экземпляров сцен в редакторе. Чтобы узнать, как создавать экземпляры сцен из кода, см. Nodes and scene instances.
Подход Godot к экземпляризации (instancing), описанный ниже, не следует путать с аппаратной экземпляризацией, которая может использоваться для быстрого рендеринга большого количества похожих объектов. Вместо этого см. Оптимизация с использованием мультисеток.
В предыдущей части мы увидели, что сцена - это набор узлов, организованных в древовидную структуру, корнем которой является один узел. Вы можете разделить свой проект на любое количество сцен. Эта функция поможет вам разбить и организовать различные компоненты вашей игры.
Вы можете создавать сколько угодно сцен и сохранять их как файлы с расширением .tscn, что означает "текстовая сцена" ("text scene"). В качестве примера можно привести файл label.tscn из предыдущего урока. Мы называем эти файлы "упакованными сценами", поскольку они содержат информацию о содержимом сцены.
Вот пример мяча. Он состоит из RigidBody2D являющегося корневым узлом с именем Ball, который позволяет мячу падать и отскакивать от стен, узла Sprite2D и узла CollisionShape2D.
Если вы сохранили сцену, она работает как шаблон: вы можете воспроизводить её в других сценах столько раз, сколько захотите. Воспроизведение объекта по шаблону называется инстанцирование (от слова instance - "экземпляр").
Как мы упоминали в предыдущей части, инстанцированные сцены ведут себя как узлы: редактор скрывает их содержимое по умолчанию. При экземпляре Ball отображается только узел Ball. Обратите внимание, что каждый дубликат имеет уникальное имя.
Каждый экземпляр сцены Ball начинает с той же структуры и свойств, что и ball.tscn. Однако вы можете изменять каждый из них независимо, например, изменять то, как они отскакивают, сколько они весят, или любое свойство, открытое исходной сценой.
На практике
Давайте воспользуемся созданием экземпляров (инстанцированием) на практике, чтобы увидеть, как именно оно работает в Godot. Загрузим проект с мячом, который мы подготовили для вас: instancing_starter.zip.
Распакуйте архив на своём компьютере. Для его импорта вам потребуется Менеджер Проектов. Менеджер Проектов доступен при открытии Godot, либо, если вы уже открыли Godot, кликните на Проект -> Выйти в список проектов (Project -> Quit to Project List) (Ctrl + Shift + Q, Ctrl + Option + Cmd + Q на macOS)
В Менеджере Проектов нажмите кнопку Import, чтобы импортировать проект.
В появившемся окне перейдите в папку, которую вы извлекли. Дважды щёлкните по файлу project.godot, чтобы открыть его.
Наконец, нажмите кнопку Import & Edit button (Импорт и редактирование).
Может появиться окно с уведомлением о том, что проект в последний раз открывался в более старой версии Godot, это не проблема. Нажмите Ok, чтобы открыть проект.
Проект содержит две упакованные сцены: main.tscn, содержащую стены, о которые ударяется мяч, и ball.tscn. Главная сцена должна открыться автоматически. Если вместо основной сцены вы видите пустую 3D сцену, кликните на кнопку 2D в верхней части экрана.
Добавим шар в качестве дочернего элемента узла Main. В панели Scene выберите узел Main. Затем щёлкните значок ссылки в верхней части панели Scene. Эта кнопка позволяет добавить экземпляр сцены и сделать его дочерним узлом выбранного в данный момент узла.
Дважды щелкните на сцену с шаром, чтобы создать ее экземпляр.
Шар появляется в левом верхнем углу области просмотра.
Нажмите на него и перетащите его к центру вида.
Запустите игру, нажав F5 (Cmd + B на macOS). Вы должны увидеть, как он падает.
Теперь мы хотим создать больше экземпляров узла Ball. Когда шар все ещё выделен, нажмите Ctrl-D (Cmd-D на macOS), чтобы вызвать команду дублирования. Щелкните и перетащите, чтобы переместить новый шар в другое место.
Вы можете повторять этот процесс до тех пор, пока в сцене не появятся несколько.
Запустите в игру ещё раз. Теперь вы должны увидеть, что каждый шарик падает независимо друг от друга. Это то, что делают экземпляры. Каждый из них является независимым экземпляром сцены-шаблона.
Редактирование сцен и экземпляров
И это ещё не всё. С помощью этой особенности вы можете:
Измените свойства одного шара, не затрагивая другие, с помощью Инспектора.
Измените свойства по умолчанию для каждого шара, открыв сцену
ball.tscnи внеся изменения в узел Ball там. После сохранения, все экземпляры Ball в проекте получат новые значения параметров.
Примечание
Изменение свойства экземпляра всегда переопределяет значения из соответствующей упакованной сцены.
Давайте попробуем это. Дважды щелкните ball.tscn в файловой системе, чтобы открыть его.
В доке Scene слева выберите узел Ball. Затем в Inspector справа щелкните свойство PhysicsMaterial, чтобы развернуть его.
Установите свойство Отскакивание (Bounce) в 0.5, щелкнув по полю с цифрами, введя 0.5 и нажав Enter.
Запустите игру, нажав F5 (Cmd + B на macOS), и обратите внимание, что все мячи теперь отскакивают гораздо сильнее. Поскольку сцена "Ball" является шаблоном для всех экземпляров, её изменение и сохранение приводит к соответствующему обновлению всех экземпляров.
Теперь давайте настроим отдельный экземпляр. Вернитесь к главной сцене, нажав на соответствующую вкладку над окном просмотра.
Выберите один из экземпляров узла Ball и в инспекторе установите значение Gravity Scale равным 10.
Рядом с измененным свойством появится серая кнопка «вернуть».
Этот значок указывает на то, что вы переопределяете значение из исходной упакованной сцены. Даже если вы измените свойство в исходной сцене, переопределение значения будет сохранено в экземпляре. Нажатие на значок возврата приведет к восстановлению значения свойства в сохраненной сцене.
Запустите игру заново и обратите внимание, что теперь этот шарик падает гораздо быстрее остальных.
Примечание
Вы можете заметить, что вы не можете изменить значения PhysicsMaterial мяча. Это потому, что PhysicsMaterial — это ресурс, и его нужно сделать уникальным, прежде чем вы сможете редактировать его в сцене, которая ссылается на его исходную сцену. Чтобы сделать ресурс уникальным для одного экземпляра, щелкните правой кнопкой мыши свойство Physics Material в Инспекторе и выберите Make Unique в контекстном меню.
Ресурсы - это ещё один важный компонент игры Godot, о котором мы расскажем в одном из последующих уроков.
Экземпляры сцены как дизайн языка
Экземпляры и сцены в Godot предлагают отличный язык проектирования, выделяя движок среди других. Мы с самого начала разрабатывали Godot с учетом этой концепции.
При создании игр с Godot мы рекомендуем отказаться от архитектурных шаблонов кода, таких как Model-View-Controller (MVC) или диаграммы Entity-Relationship. Вместо этого вы можете начать с того, чтобы представить себе элементы, которые игроки увидят в вашей игре, и структурировать код вокруг них.
Например, вот как можно представить себе простой шутер:
You can come up with a diagram like this for almost any type of game. Each rectangle represents an entity that's visible in the game from the player's perspective. The arrows point towards the instantiator of each scene.
Когда у вас будет диаграмма, то для разработки вашей игры мы рекомендуем создать сцену для каждого элемента, перечисленного в ней. Для построения дерева сцен вы будете использовать инстацирование (создание экземпляров), либо с помощью кода, либо непосредственно в редакторе.
Программисты обычно тратят много времени на проектирование абстрактных архитектур и попытки вписать в них компоненты. Проектирование на основе сцен ускоряет и упрощает разработку, позволяя сосредоточиться на логике игры. Поскольку большинство компонентов игры напрямую связаны со сценами, использование дизайна, основанного на экземплярах сцен, означает, что вам нужен немного другой архитектурный код.
Вот пример диаграммы сцены для игры с открытым миром с множеством ресурсов и вложенных элементов:
Представьте, что мы начали с создания комнаты. Мы могли бы сделать пару разных комнатных сцен с уникальной расстановкой мебели в них. Позже мы могли бы создать сцену дома, в которой для интерьера использовалось бы несколько экземпляров комнаты. Мы создадим цитадель из множества экземпляров домов и большого ландшафта, на котором мы разместим цитадель. Каждая из них будет сценой, создающей одну или несколько вложенных сцен.
Позже мы можем создать сцены, которые представляют собой стражников, и добавить их в нашу крепость. Потом, они будут добавлены в общий игровой мир.
С помощью Godot можно легко итерационно дорабатывать игру, ведь всё, что вам нужно - это создавать и инстанцировать новые сцены. Мы разработали редактор так, чтобы он был доступен и программистам, и дизайнерам, и художникам. В типичном процессе командной разработки могут участвовать 2D или 3D художники, дизайнеры уровней, гейм-дизайнеры и аниматоры, и все они работают с редактором Godot.
Подведение итогов
Инстанцирование, процесс создания объекта из шаблона имеет множество полезных применений. Со сценами это даёт вам:
Возможность разделить свою игру на многократно используемые компоненты.
Инструмент для структурирования и инкапсуляции сложных систем.
Язык, позволяющий думать о структуре вашего игрового проекта естественным образом.