Як я маю справу з групами залежних суб'єктів у двигуні системи-компонентної системи?


47

Переглянувши кілька моделей ігрового дизайну, я погодився з Entity-Component-System (ES System) для мого ігрового двигуна. Я читаю статті (головним чином T = Машина ) та переглядаю деякий вихідний код, і думаю, що мені достатньо, щоб почати роботу.

Є лише одна основна ідея, з якою я борюся. Як я маю справу з групами сутностей, які залежать один від одного?

Дозвольте скористатись прикладом:

Припустимо, що я створюю стандартний стрілець (думаю, що Джеймстаун ), і хочу створити "начальник" з декількома чіткими, але пов'язаними частинами. Розбивка може виглядати приблизно так:

  • Корпус судна: Рух, Надання
  • Гармата: позиція (заблокована відносно корпусу судна), відстеження \ вогонь у героя, пошкодження до вимкнення
  • Основні: Положення (заблоковано відносно корпусу судна), Відстеження \ вогонь у героя, Пошкодження до моменту вимкнення, Відключення (е ... знищення) всіх інших об'єктів групи судна

Моєю метою було б те, що було б ідентифіковано (і маніпулювалося) як окремий ігровий елемент, без того, щоб переписувати підсистему з нуля кожного разу, коли я хочу створити новий сукупний Елемент.

Як я реалізую такий дизайн в системі ES?

  1. Чи реалізую я якісь відносини батько-дитина (суб'єкти можуть мати дітей)? Це, мабуть, суперечить методології того, що Суб'єкти просто порожній контейнер і змушує його відчувати себе більше OOP.
  2. Чи реалізую я їх як окремі об'єкти, з якимось з'єднувальним компонентом (BossComponent) та пов'язаною системою (BossSubSystem)? Не можу не стверджувати, що це буде важко реалізувати, оскільки те, як компоненти спілкуються, здається великою пасткою для ведмедів.
  3. Чи реалізую я їх як одне ціле об'єднання із набором компонентів (ShipComponent, CannonComponents, CoreComponent)? Це, здається, відповідає способу намірів системи ES (компоненти тут здаються занадто схожими на велику вагу), але я це знаю, тому я подумав, що я викладу це там.
  4. Чи реалізую я їх як щось інше, про що я згадав?

Я знаю, що це може бути реалізовано дуже легко в OOP, але мій вибір ES через OOP - це той, якого я буду дотримуватися. Якщо мені потрібно розібратися з чистою теорією ES, щоб реалізувати цю конструкцію, я буду (як не раніше мені не довелося йти на компроміс із чистим дизайном), але я вважаю за краще робити це з міркувань продуктивності, а не починати з поганого дизайну.

Щоб отримати додатковий кредит, подумайте про той самий дизайн, але кожен з "начальницьких об'єднань" насправді був пов'язаний з більшим "об'єктом BigBoss", виготовленим з основного корпусу, основного ядра та 3 "Суб'єктів Бос". Це дозволило б мені побачити рішення принаймні на 3 виміри (дідусь-батько-дитина) ... що для мене повинно бути більш ніж достатньо.


2
Це просто різні сітчасті компоненти, прикріплені до сутності, корабельні та гарматні сітки, прикріплені до начальника, не роблять надмірного зародження. Btw система компонент сутності є OOP!
Майк Семдер

2
Так - гірша частина цих статей про T-Machine - це помилкова думка, що це якось не орієнтоване на об’єкти. Більшість компонентних систем для організацій повністю об'єктно-орієнтовані, просто не засновані на спадкуванні.
Килотан

3
Я думаю, що вони підкреслюють непринциповий характер, оскільки "мислення класичного ООП" загрожує вам стільки проблем. Я допоміг небагатьом людям розпочати роботу із системами сутності, і це найбільше перешкода. Спроба ввести код у компоненти, намагаючись мати компоненти, які підкласирують один одного тощо, спочатку є величезною проблемою, але приємно бачити світло, коли ідея нарешті повністю зрозуміла.
PSpeed

@MaikSemder Я очистив свої коментарі та перемістив їх у чат
MichaelHouse

1
Так що я розумію @MaikSemder, у системі ES, на яку ви посилаєтесь, суб'єкт господарювання може мати декілька компонентів одного типу, і підсистема, відповідальна за ці компоненти, повинна мати справу з цим фактом? Таким чином, у суб'єкта може бути декілька компонентів візуалізації, а дані та підсистеми цих компонентів визначатимуть, як правильно їх відтворити? Це призведе до меншої кількості сутностей, потенційно меншої кількості компонентів, але трохи глибшої логіки підсистеми, правда?
Джон Даніельс

Відповіді:


41

Якби я опинився в цій ситуації, я створив би кожну частину начальника як окрему сутність. Ці "суб-суб'єкти" включали б якийсь AttachmentPointабо ParentEntityкомпонент. Цей компонент повинен містити посилання на материнську особу та зміщення з позиції батьків. Оновляючи позицію, вони перевіряють батьківську позицію і застосовують зміщення для створення власної позиції. Крім того, він може здійснити перевірку, щоб переконатися, що материнське підприємство все ще існує. Крім того, ви можете мати SubEntityкомпонент, який відстежує існування суб-сутностей для материнської сутності. Це дозволяє вам робити такі речі, як тільки роблять серцевину боса вразливою, коли зброя із щитами знищена.

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

Створення кожної частини власною сутністю підтримує гнучкість структури сутності / компонента, дозволяючи додавати додаткові та різні компоненти до кожної частини шефа. Наприклад, одна частина боса може мати компонент пістолета та оздоровчий компонент, а інша - компонент щита та оздоровчий компонент.

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


Тут багато хорошої інформації. Ви добре пояснили рішення, подайте мені приклад і, мабуть, відповім на ще 1 або 2 запитання, до яких я повинен був би повернутися пізніше. Пов'язана дискусія також здається інтригуючою, особливо коли я починаю більш важко реалізовуватися. Дякую @ Byte56!
Джон Даніельс

Без проблем, Джон! Звичайно, існує багато різних способів впровадження системи ЄС. Система, яку я мав на увазі для цієї відповіді, є тією, яку я описав у цій відповіді . Успіхів у вашій грі!
MichaelHouse

Ваш підхід є найбільш гнучким, і його здорово використовувати в ігровому механізмі генераліст.
Койот

7

Не знаючи занадто багато деталей про ваші існуючі системи, спосіб, який я б моделював це (і я певною мірою мав власну систему сутності), - це мати такий компонент, як AttachedTo (parentEntity). Будь-якому з дітей може бути наданий компонент AttachedTo (шеф).

Потім система візуалізації (або що завгодно) захоплює об'єкти з компонентами: Position, AttachedTo тощо і формує належні ієрархії.


Це, здається, є консенсусною відповіддю. Наступного разу я дам більше деталей щодо впровадження, щоб люди могли жувати. Дякую @PSpeed!
Джон Даніельс

4

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

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

До речі, не існує "чистої теорії ЕС" - виведення об'єктів із компонентів є популярним підходом, але точний метод поки що не стандартизований.


Так, я повинен навчитися не використовувати слово "чистий" у будь-якій дискусійній дискусії ... такого немає. Маршрут ConpositeComponent здається тут консенсусом. Дякую @Kylotan!
Джон Даніельс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.