В движке Entity-Component-System, как я могу работать с группами зависимых объектов?

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

Есть только одна основная идея, с которой я борюсь. Как я могу работать с группами сущностей, которые зависят друг от друга?

Позвольте мне воспользоваться примером:

Предположим, что я делаю стандартный накладной шутер (думаю Джеймстаун ), и я хочу построить «объект босса» с несколькими отличными, но связанных частей. Разрыв может выглядеть примерно так:

  • Тело корабля: движение, рендеринг
  • Кэннон: позиция (заблокирована относительно тела корабля), Отслеживание \ Пожар героя, Принятие урона до отказа.
  • Ядро: позиция (заблокирована относительно тела корабля), Отслеживание \ Пожар героя, Взятие урона до отключения, Отключение (er ... уничтожение) всех других объектов в группе кораблей

Моя цель - это то, что было бы идентифицировано (и манипулировано) как отдельный игровой элемент, без необходимости переписывать подсистему с нуля каждый раз, когда я хочу построить новый совокупный элемент.

Как реализовать такой вид дизайна в ES System?

  1. Я реализую какое-то отношение между родительскими и дочерними объектами (у субъектов могут быть дети)? Это, по-видимому, противоречит методологии, что Entities - это просто пустой контейнер и делает его более ощутимым ООП.
  2. Я реализую их как отдельные объекты, с каким-то соединительным компонентом (BossComponent) и связанной с ним системой (BossSubSystem)? Я не могу не думать, что это будет сложно реализовать, поскольку взаимодействие компонентов кажется большой ловушкой для медведей.
  3. Я реализую их как один Entity, с набором компонентов (ShipComponent, CannonComponents, CoreComponent)? Похоже, что это похоже на стремление системы ES (компоненты здесь кажутся слишком похожими на тяжелые сущности), но я знаю, поэтому я решил, что положу это там.
  4. Я реализую их как что-то еще, что я упомянул?

Я знаю, что это очень легко реализовать в ООП, но мой выбор ES над ООП - это тот, который я буду придерживаться. Если мне нужно сломаться с чистой теорией ES для реализации этого проекта, я буду (не так, как раньше мне не приходилось компрометировать чистый дизайн), но я бы предпочел сделать это по причине производительности, а не начинать с плохого дизайна.

Для дополнительного кредита подумайте о том же дизайне, но каждый из «сущностей босса» фактически связан с более крупным «объектом BigBoss», состоящим из основного тела, основного ядра и 3 «Boss Entities». Это позволило бы мне увидеть решение по крайней мере для трех измерений (grandparent-parent-child) ... для меня это будет более чем достаточно.

Приветствуются ссылки на статьи или примеры кода. Спасибо за ваше время.

39 голосов | спросил John Daniels 8 J000000Sunday12 2012, 20:01:17

3 ответа


34

Если бы я был в этой ситуации, я бы создал каждую часть босса как отдельную сущность. Эти «суб-сущности» будут включать в себя какой-то компонент AttachmentPoint или ParentEntity. Этот компонент будет включать ссылку на родительский объект и смещение от позиции родителей. При обновлении позиции они проверяют родительскую позицию и применяют смещение для создания своей собственной позиции. Кроме того, он может выполнять проверки, чтобы гарантировать, что родительский объект все еще существует. Кроме того, вы можете иметь компонент SubEntity, который отслеживает существование сущностей для родительского объекта. Это позволяет вам делать вещи, как только сделать ядро ​​босса уязвимым, когда оружие со щитами уничтожено.

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

Создание каждой части своей собственной сущности поддерживает гибкость структуры entity /component, позволяя вам добавлять дополнительные и разные компоненты в каждую часть босса. Например, одна часть босса может иметь компонент пистолета и компонент здоровья, а другой - компонент экрана и компонент здоровья.

Я нашел еще одно обсуждение этой темы здесь . В которых пользователи обсуждают добавление нескольких компонентов одного и того же типа в один объект (что мне кажется плохой идеей). Кажется, это полезный разговор, хотя я не читал все обсуждения.

ответил MichaelHouse 8 J000000Sunday12 2012, 21:02:11
6

Не зная слишком много деталей о ваших существующих системах, я бы смоделировал это (и в некоторой степени в моей собственной системе сущностей) должен иметь такой компонент, как AttachedTo (parentEntity). Затем любому из детей может быть предоставлен компонент AttachedTo (босс).

Система рендеринга (или что-то еще) затем захватывает объекты с компонентами: Position, AttachedTo и т. д. и формирует правильные иерархии.

ответил PSpeed 8 J000000Sunday12 2012, 20:46:44
3

Если вы хотите иметь сущность, представленную только идентификатором, то сдерживание объектов может быть выполнено с помощью специального компонента. Вы можете назвать его CompositeComponent, и это содержит список идентификаторов дочерних сущностей и интерфейсы для добавления /удаления дочерних элементов из этого списка.

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

Кстати, нет «чистой теории ЭС» - превращение сущностей из компонентов является популярным подходом, но точный метод отнюдь не стандартизирован.

ответил Kylotan 8 J000000Sunday12 2012, 20:56:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132