Яка роль "систем" в компонентній архітектурі об'єкта?


177

Я багато читав про компоненти та системи сутності та вважав, що ідея сутності, яка є лише ідентифікатором, є досить цікавою.

Однак я не знаю, як це повністю працює з аспектом компонентів або системним аспектом. Компонент - це просто об’єкт даних, яким керується якась відповідна система. Система зіткнення використовує деякі BoundsComponent разом із структурою просторових даних, щоб визначити, чи відбулися зіткнення.

Все добре поки що, але що робити, якщо декілька систем потребують доступу до одного компонента? Де мають жити дані? Система введення може змінювати сутність BoundsComponent, але фізична система (-и) потребують доступу до того ж компонента, що і деяка система візуалізації.

Також, як будуються сутності? Однією з переваг, про яку я так багато читав, є гнучкість у побудові сутності. Чи системи по суті пов'язані з компонентом? Якщо я хочу ввести якийсь новий компонент, чи потрібно також вводити нову систему чи змінювати існуючу?

Інша річ, яку я часто читав, - це те, що "тип" суб'єкта виводиться з того, які компоненти він має. Якщо моя сутність є лише ідентифікатором, то як я можу знати, що мою сутність робота потрібно перемістити або винести та змінити таким чином в якійсь системі?

Вибачте за довгий пост (або принаймні так здається з мого екрану телефону)!

Відповіді:


336

Існує безліч способів представити та реалізувати компоненти компонентів, але тут є пояснення одного із способів. Майте на увазі, що немає конкретного визначення архітектури об'єктів / компонентів / систем, тому це лише одна реалізація.

Я збираюся ввести аналогію для архітектур сутностей / компонентів / систем, яка може допомогти. Давайте подумаємо про сутність як про ключ.

Сутність

Ключ особи

У ключів також є зуби (темно-синього кольору). Ключ зубів нашої сутності - це компоненти, які складають його. Ви можете розповісти особам окремо за їх посвідченням особи, навіть якщо вони мають однакові зуби. Отже, до чого кладуть ключі? Замки. Замки - це наші системи. Наприклад, система руху.

Система

Блокування системи руху

Замок працює лише в тому випадку, якщо у нашого ключа є зуби як для позиції, так і для швидкості. Ця система обробляє лише сутності, які мають положення та швидкість. Існує кілька способів налаштування того, як ці системи розпізнають, які сутності обробляють, але одним із способів є використання long. Кожен біт зарезервований для типу компонента. Для нашого прикладу давайте припустимо 4-бітний тип замість 64-бітового. У нашому прикладі суб'єкт господарювання мав би всі доступні компоненти. Отже, це було б ключовим 1111. Тоді система шукає будь-яку сутність, яка має 11--. ( -Представнику все одно, адже рух не має значення, якщо є спрайт чи здоров'я). Він може перевірити сутність за допомогою простої ANDоперації. Тож наша сутність відповідає, якщо ((1111 & 1100) == 1100). Якщо я втратив вас там, ознайомтеся ще з приводу бітових операцій .

Як бачите, системи мають доступ до зовнішніх ресурсів. Вони можуть отримати доступ до часу, графіки, звуку тощо. Це просто маленькі процесори, які беруть по одній клавіші за один раз і обробляють дані. Ви бачите, що система руху займає швидкість, час дельта та положення; потім проводиться деякий розрахунок і зберігається результат у положення.

Ключі сутності створюються дуже просто. Ви можете їх додати або видалити за бажанням. Суб'єкт не хвилює, це лише спосіб згрупувати та утримувати компоненти. Компоненти не мають взаємозалежності. Найближчі компоненти взаємодіють один з одним, коли система працює над ними і використовує дані однієї для оновлення іншої, як наш приклад руху.

Давайте подивимось на іншу систему, яка допоможе закріпити ідею:

Блокування системи креслення

Це наша система малювання. Він шукає компоненти, які відповідають 1-1-. Ця сутність відповідає тому, що: ((1111 & 1010) == 1010)Крім того, ви можете бачити, що ця система виводить інформацію на екран, малюючи спрайт сутності у своєму положенні.

Добре, ще один. Давайте подивимось на іншу сутність і подивимось, як вона могла вписатися в наш приклад поки що.

Немобільний ключ об'єкта

Як бачимо, до цього об'єкта додано менше компонентів. Дивлячись на компоненти, які у нього є, схоже, що це може бути статичний предмет, як скеля. У нього просто є позиція і спрайт. Він не рухатиметься, і ніякі зміни в стані здоров'я не впливатимуть. Ця організація створила б ключ 1010. Отже, які системи працюють на цьому об'єкті? Давайте перевіримо:

Проти нашої системи руху: ((1010 & 1100) != 1100)Ні. Схоже, що система руху не переймається цією сутністю, оскільки в ній немає необхідних компонентів.

Проти нашої системи малювання: ((1010 & 1010) == 1010)Гей, це збіг. Цією сутністю керуватиме система малювання. Система малювання буде малювати спрайт у визначеному положенні.


Сподіваємось, ви зможете побачити, як легко було б зараз додати іншу систему, яка б приймала наші компоненти та працювала над ними. Дозвольте мені переконатися, що я вирішив ваші питання:

Що робити, якщо декілька систем потребують доступу до одного компонента? Де мають жити дані?

Зазвичай системи працюють одна за одною. Вони обробляють усі сутності, які відповідають їхнім вимогам, потім наступна система робить те саме і так далі. Дані живуть з сутністю. У системі не повинно бути нічого, що зберігається, це лише замок, який перетворюється, ключовим є те, де інформація залишається і переходить від блокування до блокування.

Як будуються сутності? Чи системи по суті пов'язані з компонентом? Якщо я хочу представити якийсь новий компонент, чи потрібно також вводити нову систему чи змінювати існуючу?

Суб'єкти - це просто сумки компонентів. Вони мають унікальний ідентифікатор та перелік компонентів. Системи прив’язуються до компонентів лише способом, описаним вище. Ви можете мати компоненти без систем, що працюють на них, але це зовсім безглуздо. Так само ви можете мати системи, які шукають компоненти, які не мають жодних організацій. Це менш безглуздо, адже вони, можливо, просто чекають створення об'єкта, який відповідає їхньому блокуванню. Отже, так, якщо ви вводите новий компонент, ви хочете створити систему, яка використовує цей компонент. Інакше ви просто додаєте зуби до свого ключа для блокування, якого не існує.

Якщо моя сутність є лише ідентифікатором, то як я можу знати, що мою сутність робота потрібно перемістити або винести та змінити таким чином в якійсь системі?

Я думаю, що я відповідаю на це ідеєю longключа, який визначає компоненти, що містяться в об'єкті. Ви знаєте, тому що ключ підходить до замка.

Фу! То був довгий пост! (Або принаймні так здається з мого великого монітора.)


23
Ця ключова аналогія справді корисна для розуміння всієї ідеї зараз. Блискуча ідея! Lol у своєму останньому абзаці :)
bio595

16
+1 Для найбільшого і найкращого пояснення системи-компонентів сутності, яку я коли-небудь бачив. : О!
knight666

7
-1 від мене - не тому, що це поганий підхід, а тому, що він зображується як підхід. Тим не менш, існує багато систем, де немає поділу компонентів і служб (наприклад, в Unity), і є більш прості способи, щоб системи могли знати, які сутності обробляти (просто додайте їх, коли створено сутність).
Кілотан

37
@Kylotan Я кажу « Є кілька способів налаштувати , як ці системи розпізнають , які об'єкти для обробки, але один з способів полягають у використанні long. » Крім того, я зазвичай залишаю за собою вниз голосування для відповідей, які не є корисними (як текст ширяння каже). Я думаю, ви витратили б багато часу на голосування, якби це зробили за всі відповіді, які не охоплювали 100% тем, які вони стосуються.
MichaelHouse

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.