Больше веселья с ES ...
В настоящее время у меня есть несколько систем:
- Renderer (атрибут Renderable, атрибут Transform)
- Движение (атрибут «Подвижный», атрибут «Преобразование», атрибут «Renderable» [для ограничительных рамок и т. Д.])
- Input (атрибут InputReceiver)
- и т.п.
Я добавляю обнаружение столкновений. Моей первой мыслью было добавить новую систему, которая выполняет столкновение. Это имеет смысл для меня , чтобы держать это изолировано от Motionсистемы , так как не все, что движение или анимированы обязательно участвуют в обнаружении столкновения - камеры, туман и т.д. - но, кажется, Collisionи Motionявляются взаимозависимыми.
Когда Motionперемещается объект, трансформация должна быть подтверждена с помощью Collision, а движение либо отменено, либо скорректировано (подпрыгивание, остановка у стены и т. Д.).
Альтернативой может быть создание атрибута Collidable, который поддерживает ссылку на объект столкновения - kd-tree, octree и т. Д., Который совместно используется объектами, которые могут сталкиваться друг с другом. Затем Motionсистема проверит этот атрибут и использует его для проверки или корректировки движения.
С точки зрения кода это приемлемое решение. Однако, с точки зрения архитектуры ECS, кажется, что она проталкивает логику в Motionсистему, которая не применяется ко всем объектам, которые имеют Movableатрибут.
Я мог бы также хранить вектор движения в Movableатрибуте, и есть Colliderсистема регулировки по Transformмере необходимости, но это будет включать в себя дублирование функциональных возможностей между Motionи Collider, или обратного вызова от Colliderк Motionс некоторыми данными о местоположении столкновений и поверхностных данных для отскока / отражения, и т.д. ,
Это может подпадать под заголовок «взломать особый случай», но я хотел бы получить некоторую информацию от тех, кто обрабатывал это раньше, без создания тонны краевого кода случая.
Вопрос Какой хороший способ избежать тесной связи между системами движения и столкновения, когда кажется, что они требуют знания друг друга?