将不同大小的对象添加到世界的最佳解决方案是什么?

时间:2018-03-22 12:10:27

标签: unity3d optimization location coordinate generate

我正在开发一个游戏,我使用不同大小的物体 - 例如房屋,树木等。我的问题是,我应该确定哪个方式是我要放置我的物品的地方?每次游戏发布时都会随机生成世界。

(我只使用x和z坐标)例如,我在一个项目池中有一个树,大小为10x10,位置为10,0,10,我要添加一块大小为5x5的石头例如。那么我怎么告诉石头“嘿,你不能把你自己放在x轴上5到15和z轴上5到15的坐标上,放在其他地方”。

是的,一个简单的方法就是记下所有坐标(5,6,7 ...... 14,15),但如果我有1000棵树呢?有没有更好更快的方法来定位项目的自由点,除了循环遍历坐标列表的坐标列表?

2 个答案:

答案 0 :(得分:0)

哈希表搜索背后的逻辑可以鼓舞人心。

提醒我们hash-table:

在哈希表中搜索n

  • 我们首先查看h(n)其中h是哈希函数。
  • 报告记录是否命中,如果未命中则移至h(n)+1。
  • 报告记录是否命中,如果未命中则移至h(n)-1。
  • 报告记录是否命中,如果未命中则移至h(n)+2。
  • 报告记录是否命中,如果未命中则移至h(n)-2。
  • 报告记录是否命中,如果未命中则移至h(n)+4。
  • 报告记录是否命中,如果未命中则移至h(n)-4。
  • ...

我们将步长设置为2 ^ i序列中的数字及其负数(0,1,-1,2,-2,4,-4,8,-8,16,...)

现在在你的场景中:

  • 我们首先查看t,其中t是目标位置。
  • 报告位置是否有空,如果不是,请移至[t.x,t.y + 1]。
  • 报告位置是否免费,如果不是,请移至[t.x,t.y-1]。
  • ...
  • 报告位置是否免费,如果不是,请移至[t.x-1,t.y-1]。
  • 报告位置是否有空,如果不是,请移至[t.x,t.y + 2]。
  • ...
  • 报告位置是否免费,如果不是,请移至[t.x,t.y + 4]。
  • ...

现在我们如何判断一个位置是否空闲?您可以创建一个实际的哈希表来存储所有对象位置。现在,当您需要检查[x,y]周围的免费位置以放置石头时,您必须在哈希表中搜索h(x,y)

如果您需要在位置[x,y]放置一个更大的物体,如3x3圆形喷泉,您还需要检查这些记录:h(x+1,y), h(x-1,y), h(x,y+1), h(x,y-1)。由于它是一个圆形对象,因此您可以近似该区域以简化,从而从搜索中移除四个相对位置,例如h(x+1,y+1), h(x+1,y-1), h(x-1,y+1), h(x-1,y-1)

之后你应该将所有这些位置添加到哈希表中,以便以后更容易找到占用位置。例如添加3x3对象需要在哈希表中添加9条记录。

请注意,哈希函数应该反映二维(或三维)世界。例如h(x,y) = x*N + y其中N是y轴上世界的最大尺寸。

答案 1 :(得分:0)

您可以使用网格系统。或者为了防止对象在放置时重叠,您只需向对象添加一个对撞机,将其设置为触发器并在放置之前检查它是否与另一个对象发生碰撞。如果你想在物体之间保持一定距离,你可以使对手更大。