一千个单位的战斗

时间:2015-02-15 17:33:07

标签: unity3d

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

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

我用Google搜索并发现了一些有趣的剔除方案。但我无法理解它或弄清楚如何统一实施它。

以下是链接:http://forum.unity3d.com/threads/overlapsphere-with-hundreds-of-agents-and-performance.157690/

所以, 你能否告诉我如何在上面的链接中使用剔除方案? 2.在实施同时有数百个预制件的战斗中还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

这些信息似乎并不可靠。然而,被描述为剔除方案实际上是一个简单的想法,但如何实现它高度依赖于您的游戏。

这个想法是根据单位的位置分开单位,这样交互操作(攻击,防御,人工智能......等)只对那些彼此足够接近的人有效。

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

  1. 将地图划分为行和列,计算每个2x2平方内的交互。 A,B,C适合相同的方格。还有B,C,D。但不是A,D。
  2.  A,B,C fit in the same square. Also B,C,D

    1. 将碰撞器与触发器一起使用,并在进入/退出碰撞器时将每个单元添加/移除到集合中。这样您就可以轻松地在每个集合中执行交互操作。
    2. 我的猜测是,如果您选择第一个选项,它将很容易实现,但由于您应该比第二个选项更频繁地更新方形成员,因此存在一些性能问题。

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


      修改

      在每个2x2平方中,这5个是唯一需要处理的交互 IF 以前的方块已经处理过了:

         (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列。我们添加了一个额外的行和列来简化计算(零方块在边界外,因此不会有单位)

      enter image description here

      现在每个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)
      

      如果我们按如下顺序处理这些交互,我们可以确保不会进行两次交互。

      enter image description here

      e.g。

        可以看到步骤1(1,1)中的
      1. 在步骤2(2,2)和(1,2)中可以看到
      2. 在步骤4(4,4)和(1,4)中可以看到
      3. 那么第5步剩下的是:

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

        显然,对于包含零平方的2x2正方形,它是相同的。只是我们跳过涉及0的交互。