Entity Component System путаница
Теперь, прежде чем я начну, я хочу сказать, что я знаю, что не существует стандартного способа внедрения ECS. Тем не менее, есть один метод, который меня интересует, но он запутался в одной конкретной вещи.
Скажем, у вас есть сущность с TransformComponent (содержит позицию) и RenderComponent (содержит спрайт), и вместе с этим у вас есть RenderSystem, отдельная от сущности. RenderSystem будет обрабатывать рендеринг всех компонентов с помощью RenderComponent и не будет заботиться о том, к какому объекту она присоединена. Но поскольку Sprite требует позиции, RenderSystem также потребуется TransformComponent.
Теперь начинается часть, в которой я запутался: если все компоненты хранятся в своем собственном векторе этого типа компонента, как я получу все сущности, которые имеют как TransformComponent, так и RenderComponent? Я не хочу использовать наивный метод циклического прохождения всех сущностей в каждой системе, извлекая сущности, которые имеют оба этих компонента, а имеют каждый компонент в векторе типа компонента. Кроме того, как системы узнали бы, что 2 компонента принадлежат одной и той же сущности? Будет ли к компонентам прикреплен EntityID?
Изменить: я только что понял, что если RenderSystem проходит через все RenderComponents и получает сущность, а затем проверяет, содержит ли эта сущность также TransformComponent, то он может визуализировать его. Но это как бы разрушает целое "Системы не заботятся о сущности", это также требует, чтобы у компонента был EntityID, который я до сих пор не уверен, должен ли он иметь. Кто-то, пожалуйста, уточните все это для меня.
1 ответ
Эта часть называется Entity Handler и требует много работы.
Самая простая форма, которую я знаю, это что-то вроде этого:
Переместите все Компоненты в один большой массив (кеш - King). Вам понадобится перечисление для каждого компонента:
enum E_Component {
Velocity,
Position,
...
};
И теперь ваша сущность - это просто индекс и массив индекса компонента.
struct Entity {
unsigned index;
unsigned components[NB_COMPONENTS]; // -1 if nothing
};
Поэтому, если Системе необходимо обновить компонент скорости, все, что вам нужно сделать, - это пройтись по вашим сущностям, проверить, есть ли компонент скорости, и обновить его.
==> Система не заботится о сущностях, только о компонентах.
Есть много лучшего способа сделать это, посмотрите на эту статью