Виявлення зіткнень та реагування на них в системі сутності


12

Більше задоволення від ES ...

В даний час у мене є кілька систем:

  • Renderer (атрибут Renderable, атрибут Transform)
  • Рух (рухомий атрибут, атрибут перетворення, атрибут переносу [для обмежувальних полів тощо])
  • Вхід (атрибут InputReceiver)
  • тощо.

Я додаю виявлення зіткнення. Першою моєю думкою було додати нову систему, яка виконує зіткнення. Для мене є сенс тримати це ізольовано від Motionсистеми, оскільки не всі речі, які рухаються або анімуються, обов'язково беруть участь у виявленні зіткнень - камери, туман тощо, - але, здається, це Collisionі Motionвзаємозалежно.

Коли Motionрухається сутність, трансформацію потрібно підтвердити Collision, а рух або скасувати, або відрегулювати (підстрибуючи, зупиняючись біля стіни тощо).

Альтернативою було б створити атрибут Collivable, який підтримує посилання на об'єкт зіткнення - kd-дерево, octree тощо, який поділяється між сутностями, які можуть стикатися між собою. Потім Motionсистема перевірятиме цей атрибут та використовує його для перевірки чи регулювання руху.

З точки зору коду, це прийнятне рішення. Однак, з точки зору архітектури ECS, здається, що це підштовхує логіку до Motionсистеми, яка не стосується всіх сутностей, які мають Movableатрибут.

Я також міг би зберігати вектор руху в Movableатрибуті і мати Colliderсистему Transformза необхідності коригувати , але це буде включати дублювання функціональності між Motionта Collider, або зворотний виклик з Colliderна Motionдеякі дані про місце зіткнення та дані про поверхню для відмов / відображення тощо .

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

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


1
Яке питання?
jcora

@Bane, що є хорошим місцем для встановлення логіки виявлення зіткнень, зберігаючи зіткнення + рух максимально окремо, а мінімізуючи взаємозалежності між системами. Мій пост був трохи
розгублений

1
Чудово, тепер поставте це у своєму питанні, напівжирним . :)
jcora

Відповіді:


7

Ти це переосмислюєш. У моєму двигуні, який також використовує сутність-компонентну систему, кожен GameObjectможе мати вказівник на a ModuleCollision.

Що відбувається, коли гра оновлюється:

  • Сцена оновлює всі об'єкти, які він містить. Він викликає Updateфункцію для кожного GameObject.
  • Всередині Updateфункції кожен GameObject лише оновлює свою швидкість і напрямок, а не своє положення.
  • GameObjectзавантажує своє поточне положення, швидкість і напрямок до свого ModuleCollision, якщо таке є.
  • Сцена проводить перевірку зіткнень на ModuleCollisionоснові.
  • Сцена викликає UpdatePostфункцію на кожному GameObject. Якщо об'єкт має модуль зіткнення, він отримує оновлене положення, швидкість і напрямок з модуля зіткнення. Позиція оновлюється зі швидкістю та напрямком.
  • GameObjectСтворює кінцеву матрицю 3х3 зі свого становища і курсу.

Так, є певне дублювання стану, але це нормально. Зробити зіткнення на a ModuleCollision- це найкращий спосіб вирішити це, оскільки в іншому випадку вам доведеться перевірити кожного, GameObjectщоб побачити, чи має він ModuleCollisionручку.


2
Отже, замість того, щоб перейматися позицією зворотного відстеження у разі зіткнення, ви розділяєте швидкість / прискорення від перекладу, змінюючи ті, що базуються на виявлених зіткненнях, а потім ці зміни розповсюджуються у другому спеціалізованому оновлення в тому ж кадрі? Здається, досить чисто. Дякую.
3Dave

3

Я би зробив це так ...

Мають три системи:

  1. Система руху
  2. Прискорення системи
  3. Система зіткнення

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

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

Запропонуйте системі виявлення зіткнень також транслювати повідомлення, якщо потрібно.

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