Недавно мне было поручено кодировать среду, основанную на компонентных системах. Поскольку у меня нет опыта в этом вопросе, у меня есть простой вопрос:
Можно ли предположить, что у сущности может быть максимум один компонент каждого типа? Я имею в виду, как:
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
Это правильное предположение? Я не могу вспомнить ни одной ситуации, когда объекту понадобилось бы два или более компонента одного типа.
Ну, нет священной библии систем компонентов сущностей. Но многие реализации, о которых я знаю, не предусматривают этого, они позволяют сущностям иметь или не иметь какой-либо компонент, но не поддерживают множественность. Аналогичным образом, с точки зрения дизайна это кажется довольно плохой идеей (много сложностей для нуля). Вы могли бы заставить это работать, но ни вы, ни я не можем придумать вариант использования. KISS и YAGNI применяются, это разумное предположение. И если позже вам понадобится добавить компонент дважды или трижды, его легко эмулировать, имея два или три разных вида компонентов. Только с переменной арностью вам нужно изменить внутренности системы, но это кажется еще более странным.
Я собираюсь поднять мою святую Библию и сказать, да, у сущности должен быть только один тип компонента! это богохульный делать иначе!
Ты не должен создавать сущностей с более чем одним компонентом одного и того же типа, иначе ты будешь стоять перед вечным проклятием.
Обычно я не очень разбираюсь в этом, но когда вы позволяете вашей системе иметь более одного компонента данного типа, привязанного к сущности, эта сложность распространяется на каждый угол вашей системы.
Теперь каждая система должна работать против предположения, что может быть больше одного компонента того же типа, присоединенного к сущности для любого типа компонента, и в этот момент вы постоянно сталкиваетесь с вопросами проектирования, такими как то, что должна делать физическая система, когда сущность имеет 14 прикрепленных компонентов положения. И что происходит, когда система рендеринга находит объект с 15 компонентами движения, но только с 4 спрайтами, ожидая совпадения компонента движения для каждого компонента спрайта? Какие компоненты движения используются для какого спрайта?
Жизнь становится намного проще, когда вы просто говорите: «один экземпляр компонента одного типа компонента на сущность».
Если вы хотите агрегировать, просто сделайте свой компонент коллекцией чего-либо. Вместо Bone
компонент, сделать его Skeleton
компонент, который хранит список костей. Вместо Pixel
компонент, сделать его Image
компонент, который хранит коллекцию пикселей. Это все хорошо, и не требует от вас нарушать и осквернять священную заповедь выше.