在运行时更新网格碰撞器的替代方案?

22
我正在制作一个游戏,用户在运行时生成网格(一直都在),因此网格具有许多顶点,在同一时间内有一个游戏对象-玩家需要在运行时生成的网格区域内触发事件。
这个游戏中的相机是3D的,但是这个生成的网格是平面的。在我的附图中,我展示了这个平面视图,以更好地展示它的外观。
现在,我每隔几秒钟更新一次网格碰撞器,但是当生成的网格具有越来越多的顶点时,它非常缓慢。
我认为这是很简单的碰撞方法,所以也许有其他方法可以检测到这个动态生成的网格而不是附加到Mesh Collider上?
更新#1
我知道Mesh Collider非常慢,不应在运行时更新。我也知道应该使用像盒碰撞器这样的基元。
但是在这种情况下,当这个平面网格每秒更新一次(并且它增长)时,会有成千上万个盒碰撞器,并且每秒都需要添加新的。这种方法也行不通。
更新#2
我的第二个想法是找到离玩家最近的三角形,并为它们创建碰撞器(盒碰撞器应该是最快的)。但我真的不知道从哪里开始或者它是否可行?有人可以帮忙吗?

Drawing 2, as an answer for @Hristo

Drawing


我不知道该为你的情况提什么建议,但是,是的,你绝对不想更新网格碰撞器(旋转、缩放和平移也是问题)。正是因为你寻求帮助的原因:重新计算代价非常昂贵。 - Draco18s no longer trusts SE
@Hristo也许可以使用LineRenderer,但这如何帮助解决碰撞问题呢? - seek
@seek 好的,你可以检测你的“GameObject”/玩家是否触碰到了线或者曾经触碰过线。 - Hristo
玩家通过后,蛇的区域可以重新访问吗? - Thomas Hilbert
玩家可以在网格中向后移动还是只能向前移动?如果他只能向前移动,那么您可以删除玩家已经通过的部分。 - Magrones
显示剩余13条评论
7个回答

1
如果网格碰撞器适用于小部分但不适用于整个长度,则在玩家绘制更长的路径时,生成多个网格碰撞器,每X个多边形或X路径长度就断开一个新的碰撞器。

1
此外,您可以禁用那些“太远”的碰撞器以提高性能。 - BooNonMooN

0

在你的情况下,不应使用任何碰撞体。看起来你正在使用一台3D相机进行2D作业。

你需要做的是:
1)将创建的网格绘制到2D图像上。通过使用第二个正交相机将网格绘制到RenderTexture中,并过滤标签,您可以得到一个仅包含网格的顶部视图图像。

2)然后,您可以使用此地图计算与您的角色的碰撞:
Graphics.Blit 将图像大小调整为角色大小并复制到RenderTexture中。您应编写一个着色器,该着色器接受两个纹理,一个是地图,另一个表示角色,将角色绘制到地图上,在着色器中将两种颜色混合成一种特殊颜色。最后,您会得到一个混合的纹理,您可以扫描该纹理并找出其中的任何特殊颜色,并执行您想要的操作。


0

0

你可以使用射线投射 - 通常需要一个碰撞器,但我找到了this(用于在没有碰撞器的情况下对网格进行射线投射的脚本),我相信你可以在你的情况下使用它。

然后,您可以向生成的网格引入一个不可见的背景,并使用射线投射来检测首先被击中的内容。如果您的玩家将保持正方形,则可以从4个角落发射射线,如果所有4个射线都击中网格,则知道您在其上方。

在重叠的情况下,由于链接中的代码可以检测到同一条射线击中的多个三角形,因此如果击中的三角形数量大于1,则知道存在重叠。您可能可以使用顺序作为某种z-index。

我没有尝试过这段代码,但它似乎已经为其他人工作过。希望这有所帮助!


0

有很多方法可以解决这个问题,但也许不使用任何碰撞器,而是在移动对象的FixedUpdate中创建自己的测试边缘实现可能是一个选项。如果它们不太多,这可能会更快。然后,您还可以指定在几何体的更改突然导致玩家越界时如何行为。

缺点是必须自己处理弹性、阻尼等问题。


0

一个基于体素的解决方案显然是答案。

至于如何实现,我无法给出详细说明,因为虽然我知道一般的答案,但我从未自己实现过 Voxel 引擎,也从未使用过任何现有的引擎。因此我只能指导你朝正确的方向努力。

基本上,你不必试图从任意点创建网格,而是可以从固定、有限且易于优化的点创建它。这就是 Minecraft 以及更复杂的游戏是如何实现的。

Sebastian Lague 的一段视频介绍了与网格生成相关的一些核心内容(此视频)


0

我可以假设这是一种赛车游戏,其中一个玩家创建赛道吗?我以前尝试过类似的东西。在我的情况下,我每帧创建了一个“轨迹段”对象,基本上是一个扁平化的立方体对象。我承认这很懒,因为它每帧都会创建一个新的盒子碰撞器。然而,我从未以这种方式遇到过任何性能问题。

Here's what it looked like.

我的建议是将网格分割成较小的游戏对象。正如您所描述的那样,似乎随着顶点数量的增加,性能会变得更糟,通过这种方式,您可以保持顶点计数较低。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接