Основные понятия Reckfell
Entity, дерево, уровень, префаб, ресурс и сигнал — роли и связи без подмены терминов.
Что находится в игре
| Понятие | Роль | Пример |
|---|---|---|
Entity | Объект иерархии с именем, родителем, детьми и жизненным циклом | Корень персонажа |
Entity2D / Entity3D | Entity с преобразованием в 2D / 3D | Объект с положением и поворотом |
| Специализированная Entity | Готовое поведение движка | Camera3D, CharacterBody3D, Button |
EntityTree | Активное дерево игры | Текущий уровень и служебные объекты |
Resource | Данные, на которые ссылаются объекты | Материал, звук, текстура |
PackedEntity | Сохранённая иерархия, из которой создают экземпляр | Загруженный префаб |
Entity — иерархический объект с наследованием классов и поведением. Одно название не означает ECS: здесь сущность не является только числовым ID для набора компонентов, обрабатываемых внешними системами.
Уровень, префаб и экземпляр
Уровень .rscene обычно собирает игровое пространство. Префаб .rprefab — повторно используемая часть: персонаж, предмет, интерфейс. Оба формата представлены PackedEntity; роль определяется путём исходного ресурса. .rdata и .rbin используются для отдельно сохраняемых данных ресурсов в текстовом и бинарном виде.
Экземпляр — отдельная живая иерархия. Load() загружает шаблон; Instantiate() создаёт экземпляр; AddChild() присоединяет его. Изменение положения экземпляра во время игры не переписывает исходный префаб. Данные ресурса, например материал, могут оставаться общими для нескольких экземпляров. Например, два экземпляра Player.rprefab имеют отдельные положения своих Entity, но могут ссылаться на один Material. Перемещение одного игрока не перемещает второго; изменение общего материала способно изменить обоих.
Родитель и Owner
Родитель определяет место в дереве и время жизни присоединённых детей. Entity2D и Entity3D по умолчанию наследуют преобразование родителя. Owner определяет включение объекта в сохраняемую иерархию: это один из его предков, но не обязательно непосредственный родитель.
AddChild() назначает родителя, но не Owner. Если создаёте и затем сохраняете иерархию из кода, сначала присоедините объект, затем назначьте нужного предка владельцем. Смена Owner не перемещает объект между родителями. Runtime-объект не сохраняется автоматически только потому, что появился в дереве.
Скрипт и сигнал
Скрипт расширяет поведение Entity. Сигнал сообщает о произошедшем событии другим объектам. Для команды конкретному объекту вызывайте метод; для уведомления заинтересованных слушателей используйте сигнал. Подписка не воспроизводит прошлые события — начальное состояние читают отдельно.
Как проходит запуск
При входе в дерево сначала выполняется _EnterTree() родителя, затем детей. _Ready() вызывается в обратном порядке: дети перед родителем. Повторное добавление той же Entity в дерево само по себе не повторяет _Ready(); для этого есть RequestReady(). Удаление из дерева через RemoveChild() само по себе не освобождает объект: его можно присоединить снова.
Кадровая логика выполняется в _Process(), физическая — по тактам _PhysicsProcess(). Открытие документа в редакторе не означает, что его Entity уже выполняют игровой код в запущенной игре. QueueFree() планирует удаление Entity и её детей. После удаления C#-ссылка может остаться; проверяйте действительность объекта перед дальнейшим использованием.
Дальше по задаче: первый проект, префабы, движение, интерфейс.