Я работаю над игрой с компонентной архитектурой. Объект Entity
владеет набором Component
экземпляров, каждый из которых имеет набор Slot
экземпляров, с помощью которых можно хранить, отправлять и получать значения. Заводские функции, такие как Player
создание объектов с необходимыми компонентами и соединениями слотов.
Я пытаюсь определить лучший уровень детализации для компонентов. Например, прямо сейчас Position
, Velocity
и Acceleration
все это отдельные компоненты, соединенные последовательно. Velocity
и Acceleration
может быть легко переписан в единый Delta
компонент, или Position
, Velocity
и Acceleration
может быть объединен вместе с такими компонентами, как Friction
и Gravity
в монолитный Physics
компонент.
Должен ли компонент иметь наименьшую возможную ответственность (за счет большого количества соединений) или же связанные компоненты должны быть объединены в монолитные (за счет гибкости)? Я склоняюсь к первому, но я мог бы использовать второе мнение.
источник
Ответы:
Существует грань между полной детализацией, которая не приводит к потере кода или состоянию, похожему на блоб (что является причиной предпочтения архитектур компонентов), и удобством использования.
Очевидно, что вещи могут иметь
Position
, но они не обязательно являются динамическими (так зачем иметьVelocity
иAcceleration
?). Однако что-то с aVelocity
будет движущимся объектом, поэтому имеет смысл такжеAcceleration
сгруппироваться.У вас будет случай, когда понадобятся v и a , но вы не хотите имитацию физики для них? Точно так же, будет ли смысл,
Gravity
если они не являются физическими объектами?TL; Dr Group, что имеет смысл.
источник
Entity
имеетPosition
и некоторые компоненты , которые делают , чтоPosition
участвуют в физике, тоEntity
есть де - факто физически. Я думаю, что я могу сделать, просто добавить некоторые компоненты для логической группировки и сохранить все основные компоненты под одной ответственностью. Поэтому добавление, скажем,Movable
кEntity
будет иметь тот же эффект , как и добавлениеPosition
,Velocity
иAcceleration
.Чтобы избежать микроуправления каждой переменной, которую я бы посоветовал, начиная с тяжелой, выбирайте подразделения вокруг ответственности и рефакторинг, когда ситуация представляется логически. Вы можете начать первые проекты на бумаге. В какой-то момент эти грубые разделения ответственности станут строительными блоками ваших сущностей.
Так что для поспешного примера у вас есть игра. Игра разбивается на Environment + State. Среда разделяется на StaticWorld + MovingStuff. Состояние распадается на AIControlled + PlayerControlled. Общая идея Повреждения распадается на TakesDamage + GivesDamage.
И так далее.
Очень похоже на общий совет "Создавайте игры, а не движки!" для новых практиков я рекомендую "Создавай Игры, а не разрабатывай системы компонентов!" потому что только с личным опытом работы с запущенной игрой вы узнаете, нужна ли в будущих работах сложная система компонентов.
источник
Мое предположение было бы объединить компоненты, которые будут иметь много взаимодействия. В вашем случае я бы сохранил положение в одном компоненте, а скорость и ускорение были бы объединены в физическом компоненте.
Но это во многом зависит от особенностей вашей игры (если вы не строите фреймворк без особой игры).
источник
Я понимаю, что это старый вопрос, но, возможно, кто-то найдет этот ответ полезным.
Я считаю, что
Systems
это поможет вам лучше понять, как создавать компоненты. Системы существуют в архитектурах, где компоненты не содержат своей собственной логики, кроме простых методов получения / установки и вспомогательных функций. Системы работают на Объектах, которые удовлетворяют требованиям Компонента. Вот почему лучше отделить данные компонента настолько, насколько это целесообразно, чтобы эти данные обрабатывались без других данных.Например, у вас может быть объект,
MovementSystem
который обновляет свои сущности наPosition
основе ихVelocity
. Это может быть для простых объектов в игре. Но для Игрока и Врагов вам может понадобиться движение,Acceleration
которое обрабатывается вAcceleratedMovementSystem
. Но для препятствий вы могли бы хотетьFriction
. Местность также может иметь трение, но это не будет иметь составляющую скорости. Но как насчетGravity
? Просто добавьте его Player, Enemy и Obstacle, и создайте егоGravitySystem
для обработки.Суть заключается в том, что чем больше развязаны ваш
Components
, тем более расширяемыйEntities
будет при использованииSystems
.Изменить: сделать последнее заявление яснее.
Изменить: Хорошо, я работал над своей собственной системой и пришел к этой реализации. Примером разделения Положения и Скорости является то, что манипулирование Скоростью вызывает изменение Положения с помощью MovementSystem. В результате для InputMovementSystem не требуется Position, чтобы заставить игрока перейти от пользовательского ввода, потому что MovementSystem подберет изменения в Velocity для применения к Position. Конечно, было бы неплохо собрать их вместе, но это пример того, почему этого не должно быть.
Недавно я прочитал сообщение в блоге, в котором говорится что-то вроде этого
источник