我正在开发用户在运行时生成网格的游戏(所有时间),因此网格有很多顶点,同时有一个GameObject - 玩家需要在它位于此区域时触发事件在运行时网格中生成。
此游戏中的相机是3D,但这个生成的网格是平的。在我附图中,我在顶视图中显示了这一点,以便更好地展示它的外观。
现在我每隔几秒就更新一次网格对撞机,但是在生成的网格有越来越多的顶点之后它很慢。
我相信这是一种非常简单的碰撞方法,所以也许还有其他方法可以检测到这种方法,而不是附加到动态生成网格的网格对撞机?
更新#1
我知道Mesh Collider非常慢,不应该在运行时更新。我也知道应该使用像盒子对撞机这样的原语。
但是在这种情况下,当这个平面网格每秒更新一次(并且它会增长)时,它将成千上万的盒子对撞机,并且每秒都需要添加新的。这种方法也行不通。
更新#2
我的第二个想法是为玩家找到最近的三角形并为它们创建碰撞器(盒子碰撞器应该是最快的)。但我真的不知道从哪里开始,甚至可能?有人吗?
答案 0 :(得分:0)
你可以使用光线投射 - 它通常需要一个对撞机,但我发现this(网格上的光线投射脚本,没有碰撞器),我相信你可以在你的情况下使用它。
然后,您可以为生成的网格物体引入不可见的背景,并使用光线投射来检测首先被击中的物体。如果你的玩家保持方形,你可以从4个角落投射一条光线,如果所有4条光线都照射到网格上,你知道你已经在它上面了。
在重叠的情况下,由于来自链接的代码可以检测到被同一光线击中的多个三角形,如果击中的三角形的数量大于1,则表示您有重叠。并且您可以将该订单用作排序的z-index。
我还没有尝试过代码,但它似乎对其他人有效。希望这有帮助!
答案 1 :(得分:0)
如果网格碰撞器仅用于小部分而不是全长,请生成多个网格碰撞器,随着玩家绘制更长的路径,每X个多边形或X长度路径就断开一个新的碰撞器。
答案 2 :(得分:0)
如果要使用动态网格对撞机,则必须使用其他物理引擎,
如果您破坏统一的网格对撞机组件或更改该组件的sharedMesh,则其性能非常差,因为物理引擎必须重建整个新的MeshColldier。
您可以看一下这篇文章:
https://forum.unity.com/threads/shadow-of-the-colossus-deformable-mesh-collider.519900/
答案 3 :(得分:0)
在这种情况下,您不应使用任何对撞机。看来您正在使用3D相机执行2D工作。
您需要的是:
1)将创建的网格物体绘制为2D图片,然后将第二个正交相机的网格物体绘制到RenderTexture中,通过过滤标签,您可以看到仅包含网格物体的俯视图。
2)然后您可以使用此地图来计算与角色的碰撞:
将您的角色大小的图像Graphics.Blit复制到RenderTexture。您应该编写一个接受两种纹理的着色器,一种是贴图,另一种代表您的角色,将角色绘制到贴图,将两种颜色混合为着色器中的特殊颜色。最后,您得到了混合的纹理,然后扫描纹理并找出其中的任何特殊颜色,然后进行下一步的工作。
答案 4 :(得分:0)
我是否应该假设这是一种赛车游戏,其中一个玩家创建了赛道?我实际上已经尝试过类似的事情。就我而言,我每帧创建一个“ Track Segment”对象,基本上是一个展平的立方体对象。我承认这是懒惰的,因为它每帧都会创建一个新的盒子碰撞器。但是,我从来没有遇到过这样的性能问题。
那么,我的建议是将网格划分为较小的游戏对象。正如您所描述的,似乎随着顶点的增加,性能会变得差很多,这样您就可以使顶点数保持较低。
答案 5 :(得分:0)
关于如何实现这一点,我无法提供详细信息,因为尽管我知道总的答案是什么,但我自己从未实现过Voxel引擎,也没有使用过任何现有的引擎。所以我只能指出正确的方向。
基本上,不是尝试从任意点创建网格,而是从固定的,有限的,易于优化的点创建网格。这就是Minecraft以及更复杂的游戏的实现方式。
塞巴斯蒂安·拉格(Sebastian Lague)的视频介绍了与this video中的网格生成相关的一些核心内容。
答案 6 :(得分:0)
在解决此问题的可能方法中,也可以选择不使用任何对撞机,而是针对移动对象的FixedUpdate中的边创建自己的测试实现。如果它们不是太多,则可能会更快。然后,您还可以指定在几何形状的变化突然导致玩家超出范围时的行为方式。
缺点是必须处理诸如跳动,使自己受挫之类的事情。