ECS — может ли объект иметь более одного компонента данного типа

Недавно мне было поручено кодировать среду, основанную на компонентных системах. Поскольку у меня нет опыта в этом вопросе, у меня есть простой вопрос:
Можно ли предположить, что у сущности может быть максимум один компонент каждого типа? Я имею в виду, как:

int COMPONENT_COUNT; //number of different components available

class Entity
{
COMPONENT* component_list[COMPONENT_COUNT];
}

тогда добавление компонента будет похоже на

component_list[component.id]=&component; //can't add more components of this type

Это правильное предположение? Я не могу вспомнить ни одной ситуации, когда объекту понадобилось бы два или более компонента одного типа.

2

Решение

Ну, нет священной библии систем компонентов сущностей. Но многие реализации, о которых я знаю, не предусматривают этого, они позволяют сущностям иметь или не иметь какой-либо компонент, но не поддерживают множественность. Аналогичным образом, с точки зрения дизайна это кажется довольно плохой идеей (много сложностей для нуля). Вы могли бы заставить это работать, но ни вы, ни я не можем придумать вариант использования. KISS и YAGNI применяются, это разумное предположение. И если позже вам понадобится добавить компонент дважды или трижды, его легко эмулировать, имея два или три разных вида компонентов. Только с переменной арностью вам нужно изменить внутренности системы, но это кажется еще более странным.

2

Другие решения

Я собираюсь поднять мою святую Библию и сказать, да, у сущности должен быть только один тип компонента! это богохульный делать иначе!

Ты не должен создавать сущностей с более чем одним компонентом одного и того же типа, иначе ты будешь стоять перед вечным проклятием.

Обычно я не очень разбираюсь в этом, но когда вы позволяете вашей системе иметь более одного компонента данного типа, привязанного к сущности, эта сложность распространяется на каждый угол вашей системы.

Теперь каждая система должна работать против предположения, что может быть больше одного компонента того же типа, присоединенного к сущности для любого типа компонента, и в этот момент вы постоянно сталкиваетесь с вопросами проектирования, такими как то, что должна делать физическая система, когда сущность имеет 14 прикрепленных компонентов положения. И что происходит, когда система рендеринга находит объект с 15 компонентами движения, но только с 4 спрайтами, ожидая совпадения компонента движения для каждого компонента спрайта? Какие компоненты движения используются для какого спрайта?

Жизнь становится намного проще, когда вы просто говорите: «один экземпляр компонента одного типа компонента на сущность».

Если вы хотите агрегировать, просто сделайте свой компонент коллекцией чего-либо. Вместо Bone компонент, сделать его Skeleton компонент, который хранит список костей. Вместо Pixel компонент, сделать его Image компонент, который хранит коллекцию пикселей. Это все хорошо, и не требует от вас нарушать и осквернять священную заповедь выше.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector