如何在实体组件系统中实现空间分区?

我的系统在组件上工作,而不需要任何关于实体的事情。 我想实现简单的网格划分,所以每个实体将根据其当前位置被赋予一个单元格。 但是系统如何知道哪些组件要更新? 例如:CollisionSystem必须检查单元内的每个组件之间的碰撞,但CollisionComponents必须以某种方式附加到网格上,以便系统知道要testing哪个碰撞,这似乎不是一个好的解决scheme。 我该怎么办?

人工智能组件(例如)必须知道世界的状态才能做出决定:让一个组件进入外部世界状态并没有什么本质的错误。

然而, 碰撞检测 通常 (并非总是)由位于要碰撞的元件之外的function来处理。 这是一个范围/背景的问题。 为了减less耦合,这似乎是你的意图,最好有一个已经有权访问所有实体(主体)的超级系统,应用冲突。 这样做可以防止实体相互之间相互了解,并且还可以对冲突检测和分辨率的sorting进行良好控制,这是至关重要的。

所以,你有你的游戏循环。 在那里你有一个处理碰撞检测和解决的阶段。 明智的select是把它分解成一个单独的function,甚至是一个完整的单独的类,这取决于你的语言和架构偏好。

鉴于你希望空间划分你的世界空间,我会建议实施一个离散的类CollisionManager 。 其中,创建您的分区结构。 在这些实体的创建/到期时,您可以添加/删除实体到CollisionManager ,最重要的是,在每次全局更新时调用CollisionManager.update() ,确保一切 – 在分区之间移动(基于实体转换,子系统)以及testing和解决分区语言环境中的冲突 – 通过单个方法调用来紧凑解决。

至于与物理相关的实体组件,它们唯一的目的是将它们各自的位置和边界信息提供给CollisionManager