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


11

Ми просто переходимо від ігрового двигуна на основі ієрархії до ігрового двигуна на основі компонентів. Моя проблема полягає в тому, що коли я завантажую модель, яка має ієрархію сіток, і, як я розумію, полягає в тому, що сутність в системі, що базується на компонентах, не може мати декілька компонентів одного типу, але мені потрібен "meshComponent" для кожного сітка в моделі. То як я міг вирішити цю проблему.

На цьому сайті вони впровадили ігровий движок на основі компонентів: http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/


Я думаю, що це занадто локалізовано.
jcora

4
Я думаю, що це загальне питання. Чи може об’єкт гри мати декілька екземплярів одного компонента?
Mathias Hölzl

Так, це могло б бути, якби його так запитали. Мені здається, ніби він шукав відповідь на дуже конкретну проблему.
jcora

4
"... сутність в системі, що базується на компонентах, не може мати декілька компонентів одного типу ..." - чому б ні?
День

Я не думаю, що це занадто локалізовано. Наприклад, в UE3, є SkeletalMeshActorлише один SkeletalMeshComponent. Це загальна проблема, яку можна вирішити різними способами.
sam hocevar

Відповіді:


13

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


Отже, у мене є ієрархія сутностей, і ці суб'єкти мають складові та пов'язані між собою. Це все-таки ігровий двигун на основі компонентів =)
Mathias Hölzl

@ MathiasHölzl це питання? Така ієрархія не є такою ж, як проблемна ієрархія в ООП. Це лише графічна ієрархія, діти-об'єкти не успадкують функціональність від свого батька і не доставлять вам проблем, зазвичай це робиться в будь-якому випадку (маючи дерево рендерингу). Ви також можете піти з Asakeron відповісти на вашу проблему, маючи список Meshs, я не бачу, як це проблематично. Можливо, я не розумію вашого запитання?
Лука Б.

-1 Не впевнений, чи справді це шлях. Якщо вам потрібен компонент, що обробляє ієрархію мереж, то чому б не мати a, ModelComponentщо містить ієрархію сіток? Розщеплення сутності саме для цього звучить як неправильне рішення проблеми. Дивіться відповіді Асакерона та Байте56.
Лоран Кувіду

@LaurentCouvidou Я не бачу, чому використання більше ніж однієї сутності було б неправильним, це здається гарним рішенням для мене. Я просто хотів дати іншу альтернативу наявності списку сіток, хоча я згоден, що список сіток також буде хорошим рішенням.
Лука Б.

@LukeB. Тому що ця група сітки може відповідати одній сутності в цілому, з компонентами, які залежать від цього, наприклад, AI, звук, фізика ... Цим ви закінчуєте графік сцени та всі її химерності.
Лоран Кувіду

8

Ваш meshComponent може містити список сіток. Я не впевнений, як ви реалізуєте свій двигун, але система може легко перебирати всі сітки та просто малювати їх.


1
У сітці є також такі компоненти, як перетворення, фізика, графіка ...
Mathias Hölzl

1
Отже, сітка - це сутність? Або все є складовою? Те, як я бачу, перетворення, фізична та графічна повинні бути компонентами сутності, а не в сітці, а сітка - це лише опис вершин.
Лука Б.

1
Так, він повинен бути компонентом, але компоненти не можуть мати компоненти, тому його важко реалізувати ієрархію моделі.
Mathias Hölzl

1
Я вважаю, що вам слід надати більше інформації про те, як ви збираєтеся побудувати свій двигун, щоб отримати кращі відповіді. Системи компонент Entity можна реалізувати різними способами, ознайомтеся з цією відповіддю Kylotan для отримання додаткової інформації про це.
Асакерон

4

Я створив би свій мережевий компонент із переліком сітчастих об’єктів. Кожен об’єкт сітки має дані сітки разом із зміщенням. Під час малювання система малювання приймає положення з позиційного компонента, потім малює кожну сітку в сітчастому компоненті в положенні + зміщення.

Ви можете мати декілька сіток всередині вашого компонента сітки, при цьому все одно говорячи з одним компонентом сітки на сутність.


1

TLDR: Створення компонента складається з декількох сіток для початку.

Я погоджуюся з Асакероном / Байт56 / Лоран в тому, що потрібен ще один рівень непрямості між сітчастими / матеріальними парами та самою сутністю. Замість того, щоб дивитися на GraphicsComponent як вершини та матеріали, подумайте про це як на краплину пікселів на остаточному растрі - як це / вони там є - це детальна інформація про реалізацію і більше нічого.

Я багато думав про це для свого проекту, і я думаю, що оптимальним рішенням є зробити GraphicsComponent набагато вищим рівнем компонента, що охоплює більшу частину функціональності традиційного об'єкта "Модель" - адже ця функціональність не є обов'язковою! Щоб зробити ці багатокутники набагато більше, ніж просто дані буфера і шейдер, наприклад:

  • Позиція, яку ви згадали
  • Дані зняття / анімації
  • Поточний прохід (наприклад, якщо використовується два альфа пропуску)
  • Інформація про лиття тіней (якщо ви це робите)
  • Інформація про те, як і коли оновлювати матеріал
  • Функція вилучення

І це лише для 3D-ресурсів, не враховуючи систем частинок, білбордів тощо. Але все це стосується лише графіки / коду візуалізації - це не впливає на фізику, звук чи сценарій, тому має сенс йому сидіти компонент Графіка / Візуалізація

Я закінчив:

Model : Entity, IHasGraphicsComponent, IHasSkeleton, IHasAnimationStore     //This is the 'game object' - it is passed to the GraphicsController
    ModelComponent : GraphicsComponent                      //This is the actual graphics component, used by the GraphicsController in the context of the game object.
        ModelComponentPart : GraphicsComponent              //This is also a graphics component
            Mesh                                        //These are implementation details
            Material
        ModelComponentPart : GraphicsComponent
            Mesh
            Material
    Skeleton
    Animations

У цьому:

  • Модель - це будь-який ігровий актив, який має графічну складову.

  • ModelComponent є аналогом традиційної моделі і насправді є для 3D-активів. Контролер GraphicsComponent (якщо ви використовуєте шаблон Model-View-Controller) несе відповідальність за з'ясування типу графічного активу та його правильне малювання (зауважте, що ModelComponent є підкласом GraphicsComponent).

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

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