Принципы архитектуры Reckfell
Родитель и базовый класс, композиция Entity, общие ресурсы, префабы и код редактора.
Два разных вида связи
Иерархия Entity и наследование C# решают разные задачи.
| Связь | Что определяет | Чего не делает |
|---|---|---|
| Родитель и ребёнок в дереве | Структуру объекта, совместимые преобразования, вход и выход из дерева | Не делает ребёнка наследником C#-класса родителя |
| Наследование типа | Доступные свойства, методы и поведение класса | Не добавляет объект в дерево |
| Owner | Какие объекты входят в сохраняемое дерево | Не заменяет Parent и не задаёт базовый C#-класс |
Если Player находится внутри World, это не означает class Player : World. Тип CharacterBody3D наследует возможности физических и пространственных базовых классов независимо от имени его родителя. См. Entity, уровни и префабы.
Собирать объект из подходящих Entity
Начните с корня, который отвечает за основное поведение. Для управляемого персонажа это может быть CharacterBody3D. Его дочерние MeshInstance3D и CollisionShape3D задают вид и форму столкновения; Camera3D может быть отдельным объектом уровня или частью иерархии персонажа.
Добавление дочерней Entity не равнозначно добавлению ECS-компонента. В Reckfell это объект типизированной иерархии с собственным жизненным циклом. Не переносите предположения о плоских ID сущностей и пакетной обработке ECS без проверки реальной архитектуры.
В 3D-примере визуальная часть и физическое тело разделены: анимация вида не должна случайно менять форму столкновения. Для поведения во времени выбирайте подходящий метод — _Process или _PhysicsProcess; основные понятия объясняют порядок событий.
Переиспользовать дерево и учитывать общие данные
Уровень .rscene и префаб .rprefab имеют разные роли, но оба представлены PackedEntity. Файл хранит описание дерева; Instantiate создаёт экземпляр, AddChild добавляет его в иерархию. Создание экземпляров показывает полный порядок.
Изменение источника и локальное переопределение свойства экземпляра — разные правки. При проверке новой версии префаба учитывайте сохранённые переопределения: нельзя обещать, что любое изменение источника заменит любое значение в каждом экземпляре.
Ресурсы могут быть общими. Если два объекта используют один Material, изменение этого ресурса может затронуть оба. Для самостоятельной вариации создайте копию и назначьте её нужному объекту; вложенные ресурсы проверяйте отдельно. Копия внешнего контейнера не всегда означает независимую копию всего содержимого.
Скрипт игры и код редактора
Игровые примеры используют C#. Редактор предоставляет собственные инструменты и допускает расширение, но его C++-исходники не являются обычным игровым проектом с project.reckfell.
В C# атрибут [Tool] разрешает выполнение скрипта в редакторе. Такой код способен менять редактируемые данные, поэтому отделяйте действия для редактора от игровой логики. Подробности и рабочие примеры — выполнение кода в редакторе.
Как принимать архитектурное решение
Выберите один игровой объект и проверьте его создание, повторное использование, удаление и повторный запуск уровня. Сначала подтвердите корректность, затем измеряйте нагрузку в целевом проекте. Производительность помогает искать конкретную причину медленного кадра; размер иерархии или название жанра сами по себе не заменяют измерение.