ES带来更多乐趣...
目前,我有一些系统:
- 渲染器(Renderable属性,Transform属性)
- 运动(可移动属性,变换属性,可渲染属性(用于边界框等))
- 输入(InputReceiver属性)
- 等等
我要添加碰撞检测。我的第一个想法是添加一个执行碰撞的新系统。这对我来说很有意义,以防止这种分离的Motion
系统,因为不是所有的东西,移动,或者动画不一定参与碰撞检测-摄像机,雾等-但似乎Collision
和Motion
相互依存。
当Motion
移动实体,变换需要与被验证Collision
,且移动或者取消,或调节(弹跳,停在一个壁等)。
一种替代方法是创建一个Collidable属性,该属性维护对碰撞对象(kd-tree,八叉树等)的引用,该引用在可以相互碰撞的实体之间共享。然后,Motion
系统将检查该属性,并使用它来检查或调整移动。
从代码角度来看,这是一个可以接受的解决方案。但是,从ECS架构的角度来看,似乎是将逻辑推入Motion
系统中,而该逻辑不适用于具有Movable
属性的所有实体。
我还可以在Movable
属性中存储一个运动矢量,并使Collider
系统Transform
根据需要进行调整,但这将涉及在Motion
和之间复制功能Collider
,或者从Collider
到Motion
进行回调,并提供一些有关碰撞位置和曲面数据的反弹/反射等信息。 。
这可能属于“特殊情况破解”的标题,但是我想从以前处理过此问题的人员那里得到一些输入而无需创建大量的边缘案例代码。
问题 当运动系统和碰撞系统似乎需要彼此了解时,如何避免它们之间的紧密耦合?