我正在为实体系统添加物理特性,但对 ECS 的系统部分感到困惑。
例如,在一个非 ECS 项目中,我可能会有这样的事情:
function updatePhysics()
foreach(thisRobot in robots)
thisRobot.move()
foreach(otherRobot in robots)
if(response = thisRobot.isColliding(otherRobot))
thisRobot.resolveCollision(response)
然而,在 ECS 项目中,我将有一个在 PositionComponent 和 VelocityComponent 上运行的 MovementSystem,以及在 PositionComponent 和 ShapeComponent 上运行的 CollisionSystem。结果是这样的:
MovementSystem
function update()
foreach(entity in entities)
this.move(entity)
CollisionSystem
function update()
foreach(thisEntity in entities)
foreach(otherEntity in entities)
if(response = this.isColliding(thisEntity, otherEntity)
this.resolve(thisEntity, response)
不同之处在于,在非 ECS 版本中,运动和碰撞是交错的,而在 ECS 版本中它们是分开的。在实体系统中是否存在对这种行为进行建模的正常模式?我知道 ECS 的全部意义在于摆脱继承,但也许让 MovementSystem 和 CollisionSystem 成为更通用的 PhysicsSystem 的一部分,它在单个实体上调用其他系统更新函数,而不是每个系统都维护自己的循环?