У меня есть система рендеринга, которая перебирает все компоненты MeshDrawData, пакетирует и рисует их. Моя реализация ECS допускает только один тип компонента для каждой сущности.
Теперь я хочу представить падг "Player". Мой OOP склад ума говорит так:
Pseudocode:
auto e = createEntity();
createSpriteComponent(e,...); // this creates a MeshDrawData internally for e entity.
createColliderComponent(e,...);
Это работает нормально, НО, скажем, теперь я тоже хочу отрисовать линию. Если я сделаю это:
Pseudocode:
auto e = createEntity();
createSpriteComponent(e,...); // this creates a MeshDrawData internally for the e entity.
createColliderComponent(e,...);
createLineComponent(e,...); // this creates a MeshDrawData internally for the e entity
Здесь вы можете увидеть проблему .. Я создал два компонента MeshDrawData для сущности e ..
Учитывая мой нереальный фон движка, я создаю актера и добавить компоненты к нему. Я всегда думал, что в ECS сущность похожа на актера, но я вижу, что я совершенно неправ.
Как вы организуете свои сущности, чтобы, например, разрешить варианты использования, подобные той, которую я упоминал ранее? Что именно должен представлять субъект?
Возможные решения:
- Никогда не создавайте объект с SpriteComponent и LineComponent, которые создают один и тот же MeshDrawData в том же объекте .. (очевидно, но подвержен ошибкам)
- Создайте дочернюю сущность для каждого SpriteComponent и / или LineComponent и добавьте ее к соответствующему дочернему элементу. Это будет работать, но это сделает длинные деревья иерархии сущностей ... не уверен, что это более подвержено ошибкам. ...