Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Создание экземпляров
Примечание
This tutorial refers to instantiating scenes in the editor. To learn how to instantiate scenes from code, see Узлы и экземпляры сцены.
Godot's approach to instantiation described below should not be confused with hardware instancing that can be used to render large amounts of similar objects quickly. See Оптимизация с использованием мультисеток instead.
В предыдущей части мы увидели, что сцена - это набор узлов, организованных в древовидную структуру, корнем которой является один узел. Вы можете разделить свой проект на любое количество сцен. Эта функция поможет вам разбить и организовать различные компоненты вашей игры.
Вы можете создавать сколько угодно сцен и сохранять их как файлы с расширением .tscn, что означает "текстовая сцена" ("text scene"). В качестве примера можно привести файл label.tscn из предыдущего урока. Мы называем эти файлы "упакованными сценами", поскольку они содержат информацию о содержимом сцены.
Вот пример мяча. Он состоит из RigidBody2D являющегося корневым узлом с именем Ball, который позволяет мячу падать и отскакивать от стен, узла Sprite2D и узла CollisionShape2D.
Once you have 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 instantiation.
As we mentioned in the previous part, instantiated scenes behave like a node: the editor hides their content by default. When you instantiate the Ball, you only see the Ball node. Notice also how each duplicate has a unique name.
Каждый экземпляр сцены Ball начинает с той же структуры и свойств, что и ball.tscn. Однако вы можете изменять каждый из них независимо, например, изменять то, как они отскакивают, сколько они весят, или любое свойство, открытое исходной сценой.
На практике
Let's use instantiation in practice to see how it works in Godot. We invite you to download the ball's sample project we prepared for you: instancing_starter.zip.
Распакуйте архив на своём компьютере. Для его импорта вам потребуется Менеджер Проектов. Менеджер Проектов доступен при открытии Godot, либо, если вы уже открыли Godot, кликните на (Ctrl + Shift + Q, Ctrl + Option + Cmd + Q на macOS)
In the Project Manager, click the button.
In the file dialog that appears, navigate to the folder you extracted.
Double-click the project.godot file to select it.
Finally, click the button to import the project.
Возможно, появится окно с уведомлением о том, что проект в последний раз был открыт в более старой версии Godot. Это не проблема. Нажмите , чтобы открыть проект.
The project contains two packed scenes: main.tscn, containing walls against
which the ball collides, and ball.tscn. The main scene should open
automatically. If you're seeing an empty 3D scene instead of the main scene, click the 2D button at the top of the screen.
Добавим шар в качестве дочернего элемента узла Main. В панели Scene выберите узел Main. Затем щёлкните значок ссылки в верхней части панели Scene. Эта кнопка позволяет добавить экземпляр сцены и сделать его дочерним узлом выбранного в данный момент узла.
Double-click the ball scene to instantiate it.
Шар появляется в левом верхнем углу области просмотра.
Нажмите на него и перетащите его к центру вида.
Запустите игру, нажав F5 (Cmd + B на macOS). Вы должны увидеть, как он падает.
Now, we want to create more instances of the Ball node. With the ball still selected, press Ctrl + D (Cmd + D on macOS) to duplicate it. Click and drag the new ball to a different location.
Вы можете повторять этот процесс до тех пор, пока в сцене не появятся несколько.
Запустите в игру ещё раз. Теперь вы должны увидеть, что каждый шарик падает независимо друг от друга. Это то, что делают экземпляры. Каждый из них является независимым экземпляром сцены-шаблона.
Редактирование сцен и экземпляров
И это ещё не всё. С помощью этой особенности вы можете:
Измените свойства одного шара, не затрагивая другие, с помощью Inspector.
Измените свойства по умолчанию для каждого шара, открыв сцену
ball.tscnи внеся изменения в узел Ball там. После сохранения, все экземпляры Ball в проекте получат новые значения параметров.
Примечание
Изменение свойства экземпляра всегда переопределяет значения из соответствующей упакованной сцены.
Давайте попробуем это. Дважды щелкните ball.tscn в файловой системе, чтобы открыть его.
В доке Scene слева выберите узел Ball. Затем в Inspector справа щелкните свойство PhysicsMaterial, чтобы развернуть его.
Установите свойство Отскакивание (Bounce) в 0.5, щелкнув по полю с цифрами, введя 0.5 и нажав Enter.
Запустите игру, нажав F5 (Cmd + B на macOS), и обратите внимание, что все мячи теперь отскакивают гораздо сильнее. Поскольку сцена "Ball" является шаблоном для всех экземпляров, её изменение и сохранение приводит к соответствующему обновлению всех экземпляров.
Let's now adjust an individual instance. Head back to the main scene by clicking on the corresponding tab above the viewport.
Select one of the instantiated Ball nodes and, in the Inspector, set its
Gravity Scale value to 10.
A gray "revert" button appears next to the adjusted property.
Этот значок указывает на то, что вы переопределяете значение из исходной упакованной сцены. Даже если вы измените свойство в исходной сцене, переопределение значения будет сохранено в экземпляре. Нажатие на значок возврата приведет к восстановлению значения свойства в сохраненной сцене.
Запустите игру заново и обратите внимание, что теперь этот шарик падает гораздо быстрее остальных.
Примечание
Вы можете заметить, что вы не можете изменить значения PhysicsMaterial мяча. Это потому, что PhysicsMaterial — это ресурс, и его нужно сделать уникальным, прежде чем вы сможете редактировать его в сцене, которая ссылается на его исходную сцену. Чтобы сделать ресурс уникальным для одного экземпляра, щелкните правой кнопкой мыши свойство Physics Material в Inspector и выберите в контекстном меню.
Ресурсы - это ещё один важный компонент игры Godot, о котором мы расскажем в одном из последующих уроков.
Экземпляры сцены как дизайн языка
Экземпляры и сцены в Godot предлагают отличный язык проектирования, выделяя движок среди других. Мы с самого начала разрабатывали Godot с учетом этой концепции.
При создании игр с Godot мы рекомендуем отказаться от архитектурных шаблонов кода, таких как Model-View-Controller (MVC) или диаграммы Entity-Relationship. Вместо этого вы можете начать с того, чтобы представить себе элементы, которые игроки увидят в вашей игре, и структурировать код вокруг них.
Например, вот как можно представить себе простой шутер:
Подобную диаграмму можно создать практически для любой игры. Каждый прямоугольник представляет собой сущность, видимую в игре с точки зрения игрока. Стрелки указывают на создателя каждой сцены.
Once you have a diagram, we recommend creating a scene for each element listed in it to develop your game. You'll use instantiation, either by code or directly in the editor, to build your tree of scenes.
Программисты обычно тратят много времени на проектирование абстрактных архитектур и попытки вписать в них компоненты. Проектирование на основе сцен ускоряет и упрощает разработку, позволяя сосредоточиться на логике игры. Поскольку большинство компонентов игры напрямую связаны со сценами, использование дизайна, основанного на экземплярах сцен, означает, что вам нужен немного другой архитектурный код.
Вот пример диаграммы сцены для игры с открытым миром с множеством ресурсов и вложенных элементов:
Imagine we started by creating the room. We could make a couple of different room scenes, with unique arrangements of furniture in them. Later, we could make a house scene that uses multiple room instances for the interior. We would create a citadel out of many instantiated houses and a large terrain on which we would place the citadel. Each of these would be a scene instantiating one or more sub-scenes.
Позже мы можем создать сцены, которые представляют собой стражников, и добавить их в нашу крепость. Потом, они будут добавлены в общий игровой мир.
С помощью Godot можно легко итерационно дорабатывать игру, ведь всё, что вам нужно - это создавать и инстанцировать новые сцены. Мы разработали редактор так, чтобы он был доступен и программистам, и дизайнерам, и художникам. В типичном процессе командной разработки могут участвовать 2D или 3D художники, дизайнеры уровней, гейм-дизайнеры и аниматоры, и все они работают с редактором Godot.
Подведение итогов
Instantiation, the process of producing an object from a blueprint, has many handy uses. With scenes, it gives you:
Возможность разделить свою игру на многократно используемые компоненты.
Инструмент для структурирования и инкапсуляции сложных систем.
Язык, позволяющий думать о структуре вашего игрового проекта естественным образом.