Більше задоволення від ES ...
В даний час у мене є кілька систем:
- Renderer (атрибут Renderable, атрибут Transform)
- Рух (рухомий атрибут, атрибут перетворення, атрибут переносу [для обмежувальних полів тощо])
- Вхід (атрибут InputReceiver)
- тощо.
Я додаю виявлення зіткнення. Першою моєю думкою було додати нову систему, яка виконує зіткнення. Для мене є сенс тримати це ізольовано від Motionсистеми, оскільки не всі речі, які рухаються або анімуються, обов'язково беруть участь у виявленні зіткнень - камери, туман тощо, - але, здається, це Collisionі Motionвзаємозалежно.
Коли Motionрухається сутність, трансформацію потрібно підтвердити Collision, а рух або скасувати, або відрегулювати (підстрибуючи, зупиняючись біля стіни тощо).
Альтернативою було б створити атрибут Collivable, який підтримує посилання на об'єкт зіткнення - kd-дерево, octree тощо, який поділяється між сутностями, які можуть стикатися між собою. Потім Motionсистема перевірятиме цей атрибут та використовує його для перевірки чи регулювання руху.
З точки зору коду, це прийнятне рішення. Однак, з точки зору архітектури ECS, здається, що це підштовхує логіку до Motionсистеми, яка не стосується всіх сутностей, які мають Movableатрибут.
Я також міг би зберігати вектор руху в Movableатрибуті і мати Colliderсистему Transformза необхідності коригувати , але це буде включати дублювання функціональності між Motionта Collider, або зворотний виклик з Colliderна Motionдеякі дані про місце зіткнення та дані про поверхню для відмов / відображення тощо .
Це може підпадати під заголовок "Спеціальний випадок", але я хотів би отримати деякий внесок з тих, хто цим займався раніше, не створюючи тонни красного коду справи.
Питання Який хороший спосіб уникнути тісного зчеплення між системами руху та зіткнення, коли здається, що вони вимагають знань один одного?