千机之战

A battle of thousand units

在 unity3d 中,我如何实现 200 个预制件与另外 200 个预制件的战斗?

假设我有一个支持预制件,它可以同时增加友好预制件的护甲并减少敌对预制件的护甲。在一场 400 个预制件(友好和敌对)彼此靠近的巨大战斗中,这将导致大量的计算,并将 fps 急剧降低到 2 或 3。

我用谷歌搜索了一下,发现了一个有趣的东西,叫做剔除方案。但是我无法理解它或弄清楚如何统一实施它。

这是link:http://forum.unity3d.com/threads/overlapsphere-with-hundreds-of-agents-and-performance.157690/

所以, 1. 能否请您解释一下如何使用上面link中的culling scheme方法? 2. 有没有其他方法实现同时有百个预制件的战斗?

信息似乎不可靠。然而,所谓的剔除方案实际上是一个简单的想法,但如何实现它在很大程度上取决于您的游戏。

我们的想法是根据它们的位置将单元分开,以便交互式操作(攻击、防御、AI 等...)仅在彼此足够接近的单元上工作。

我能想到两种不同的方法:

  1. 将地图分成行和列,计算每个 2x2 正方形内的相互作用。 A、B、C 放在同一个方格中。还有 B、C、D。但不是 A,D.

  1. 使用带触发器的对撞机,add/remove 每个单元在 enters/exits 对撞机时作为一个集合。这样您就可以轻松地在每个集合内进行交互操作。

我的猜测是,如果您选择第一个选项,它会很容易实现,但是由于您应该比第二个选项更频繁地更新方形成员,因此它存在一些性能问题。

如果你选择第二个(它需要更多研究如何使用触发器、运动学、刚体......)并且做得好,你将不太可能遇到性能问题。


编辑

在每个 2x2 方块中,这 5 个是唯一需要处理的交互 如果 前面的方块已经处理:

   (first 1x1 square, last 1x1 square) 
   (second 1x1 square, last 1x1 square) 
   (third 1x1 square, last 1x1 square) 
   (within last 1x1 square) 
   (second 1x1 square, third 1x1 square)

假设我们有一个区域分为3行3列。我们添加了额外的行和列以简化计算(零方块在边界外,因此其中没有单位)

现在每个 2x2 正方形(例如 1、2、4、5)中有 10 种交互类型:

(1,1) (1,2) (1,4) (1,5)
      (2,2) (2,4) (2,5)
            (4,4) (4,5)
                  (5,5)

如果我们像下面这样按顺序处理这些交互,我们可以确保没有交互发生两次。

例如

  1. 在step1中看到了(1,1)。
  2. 在step2中看到了(2,2)和(1,2)。
  3. 在step4中看到了(4,4)和(1,4)。

所以第 5 步剩下的是:

(1,5) (2,5) (4,5) (5,5) (2,4)

显然对于包含零个方块的 2x2 方块也是如此。只是我们跳过了涉及 0.

的交互