【问题标题】:How do we get Rigidbody behaviour in Unity3D's Entity Component System?我们如何在 Unity3D 的实体组件系统中获得刚体行为?
【发布时间】:2019-09-19 12:31:55
【问题描述】:

我在玩 ECS。我想知道是否可以将许多具有刚体的立方体实例化为实体,以便获得更多?

我想要一个场景中的数万个(如果不是更多的话)简单(Mesh + Collider + Rigidbody)对象只是为了被动地与场景交互。

【问题讨论】:

  • Unity 对游戏对象的基本实现是 ECS,所以,GetComponent<Rigidbody>()。如果这不是您想要的,您需要更好地定义您的问题。
  • 我想创建一个立方体 + 对撞机 + 刚体的 Prefab,然后创建许多 ECS 实例,并让它们的行为与我将它们创建为游戏对象一样。 @Draco18s
  • 这就是Instantiate 所做的:将预制件变成生成的游戏对象,就像您自己完成一样。再次,有什么问题?
  • 游戏运行缓慢,有很多游戏对象实例。 ECS 实例运行速度更快。
  • 嗯,是的。那是因为你说的新ECS系统是a pure data system。因此,两者不能直接比较,也没有从使用一个到使用另一个的容易理解的过渡,在纯 ECS 下,Rigidbody 和 GameObject 之类的东西不存在。

标签: unity3d entity-component-system


【解决方案1】:

ECS is an architecture pattern 代表实体组件系统。回答你的问题;是的。如果您以适应此技术要求的方式设计代码,则可能有许多简单的网格-刚体-碰撞实体实例。这个答案的其余部分是根据您所指的设计自己的游戏引擎的假设向前推进的(因为问题缺乏细节)

根据我的经验(我设计了 2 个物理引擎和 3 个自定义游戏引擎),主要瓶颈如下:

  1. 图形实现 - 无论您使用的是 OpenGL 还是 DirectX,缺乏经验或过时的图形实现都是自定义引擎瓶颈的重要来源。为了解决这个问题,我建议使用modern OpenGL tutorials,特别是在延迟渲染之类的事情上。在 DirectX 中,实现可能会变得相当复杂,因为可免费在线学习的资源较少(部分原因是在 Directx 中不同版本的实现细节差异很大)。我从最新的 directx 版本中听到的一个重要的新东西是名为 mesh shaders 的东西,它似乎“简化”了这个过程。在这一步中,研究将是你的朋友

  2. 物理 - 这会降低帧速率,尤其是在发生大量碰撞时。除非您想成为物理程序员,否则我建议使用可用的开源实现,例如 Bullet physics,这是一个出色的 C++ 物理引擎。 PhysX 是一种替代方案,但实现可能令人生畏,而且这两个库都存在低标准或简洁的文档。这些库可以很容易地(从设计角度)集成到标准 ECS 框架中。如果您坚持自己设计,我建议您阅读 Erin Catto, Erwin Coumins, Gino Van den Bergen、Dirk Gregorius 等人的 GDC 演示文稿。

至于“数以万计”,我几乎可以保证,如果它们不是球体,数以万计的被动对撞机绝对会通过自定义物理实现减慢您的引擎速度。您可以在两个领域使用迭代求解器轻松地对自定义物理引擎进行多线程处理;内部碰撞器几何更新(包括它们的包围体和世界几何)以及碰撞检测的窄阶段。如果您的广泛阶段碰撞检测输出独特的潜在碰撞对,如果您的几何在此阶段之前更新,您可以轻松地并行化实际碰撞测试,因为碰撞检测可能被视为只读任务。 最后一个简单的物理优化是use collision islands (see bottom of page under optimizations),它本质上将碰撞分成独立的组,即两个janga塔将由两个碰撞岛表示,由于数据依赖性和每个碰撞岛都可以在单独的线程中解决迭代求解器的性质。

对于成千上万的用户,您甚至可以考虑尝试使用compute shaders,因为它们非常适合被动模拟大量对象。提供的链接实际上包含了学习如何使用这些着色器的简单碰撞。

【讨论】:

  • 嗨乔恩。我不是在编写自己的游戏引擎,而是在使用 Unity3D。
  • 嗨乔恩。该问题已标记为#Unity3D
  • stackoverflow.com/help/how-to-ask “... 包括关键 API ...” 你没有这样做。标题清楚地提到了架构模式,而您的问题中根本没有提到您的 api。
  • 嗨乔恩我不确定你的解释是否正确,我必须检查一下。请不要认为您的时间被浪费了,虽然我不能用它来解决我的问题,但我觉得它很有教育意义,我非常感谢阅读它,感谢您花在上面的时间! PS:我已将 Unity3D 添加到问题标题中。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2018-01-05
  • 2016-08-17
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 2013-11-04
  • 1970-01-01
相关资源
最近更新 更多