C# 为具有多个顶点的网格创建单个网格碰撞器

C# 为具有多个顶点的网格创建单个网格碰撞器,c#,unity3d,C#,Unity3d,我正在使用unity中的网格进行一些计算,并添加了MeshCollider,以计算寻路。生成的某些网格非常大,会将网格拆分为2个或更多“网格部分”。我这样设置MeshCollider: testRoom = GameObject.Find("testroom"); MeshFilter[] _filters = testRoom.GetComponentsInChildren<MeshFilter>(); foreach (MeshFilter _filter in _filters

我正在使用unity中的网格进行一些计算,并添加了
MeshCollider
,以计算寻路。生成的某些网格非常大,会将网格拆分为2个或更多“网格部分”。我这样设置MeshCollider:

testRoom = GameObject.Find("testroom");
MeshFilter[] _filters = testRoom.GetComponentsInChildren<MeshFilter>();
foreach (MeshFilter _filter in _filters)
{
   _verts.AddRange(_filter.mesh.vertices);
   _triangles.AddRange(_filter.mesh.triangles);

   testRoom.AddComponent<MeshCollider>();
   testRoom.GetComponent<MeshCollider>().sharedMesh = _filter.mesh;
}
testRoom=GameObject.Find(“testRoom”);
MeshFilter[]_filters=testRoom.GetComponentsInChildren();
foreach(网状过滤器中的过滤器)
{
_verts.AddRange(_filter.mesh.vertexs);
_三角形.AddRange(_filter.mesh.triangles);
testRoom.AddComponent();
testRoom.GetComponent().sharedMesh=\u filter.mesh;
}
这显然不适用于多个MeshPart,因为碰撞器会被覆盖。由于网格太大,我无法将网格合并在一起并设置碰撞器,对吗?当我在unity中使用“生成碰撞器”框时,它可以正常工作,但我需要一个可编程的解决方案,因为我要在运行时生成网格

有人知道如何为由于有多个顶点而被分割成多个部分的大网格制作单个碰撞器吗

这是一张网格的图片(根据要求),它看起来可能有点奇怪,但它是办公楼的一部分。我自己用探戈平板做了这个网。我没有包括tango标签,因为我不认为网格的外观会影响答案


老实说,我不完全理解您的情况,但如果您需要一个碰撞器来覆盖从脚本创建的复杂对象,您仍然可以在运行时将其分别添加到每个对象,对吗?所以不是

testRoom.AddComponent<MeshCollider>();
testRoom.GetComponent<MeshCollider>().sharedMesh = _filter.mesh;
testRoom.AddComponent();
testRoom.GetComponent().sharedMesh=\u filter.mesh;
你能行

var collider = _filter.gameObject.AddComponent<MeshCollider>();
collider.sharedMesh = _filter.mesh;
var collider=\u filter.gameObject.AddComponent();
collider.sharedMesh=_filter.mesh;

无论如何,您不能向游戏对象添加多个MeshFilter组件,因此从testRoom.GetComponentsInChildren()获得的任何过滤器都会附加到不同的对象。因此,您可以将新的碰撞器分别添加到它们中的每一个。

当然,您可以在运行时添加碰撞器,就像您已经在做的那样。这将为您提供非常繁重且性能较差的解决方案,该解决方案工作起来很慢。在这种情况下,通常的做法是对将用作碰撞器的网格的lowpoly版本进行建模

如果对象不太复杂,另一个解决方案是框碰撞器。您需要获取renderer.bounds 并创建具有该边界的新长方体碰撞器


希望这是有意义的

很抱歉,我不清楚我的处境,不知道如何更清楚地描述给你听。您提供的代码添加了所有MeshCollider,这非常好,我将使用它,直到找到创建单个MeshCollider的方法!我不认为我可以把这个标记为“正确答案”,即使它是有效的。如果我能,请告诉我,我会的!由你来决定我的答案是否正确-)所以你想要一个能覆盖所有网格的对撞机,对吗?我不确定这是否可能。如果所有具有网格的子对象在逻辑上都是一个大对象(并且您可以通过pathfinder将它们检测为一个对象),那么您可以使用CombineMeshes()方法将所有子对象分组为一个,然后向其中添加碰撞器。除了合并它们或使用单独的对撞机,我想不出任何其他方法。好的,我明白了,这将是正确的答案,直到有人想出一种方法。我不认为我可以把它们结合起来,因为它们分开的原因首先是因为网格太大,不适合。这很有道理。我不关心性能,因为只有一个网格将有一个对撞机,然后在程序中不会改变。可悲的是,网格(由于太大,有两个子网格被分割)已经是一个低多边形网格,只包含原始数据的一小部分,所以这是可以考虑的,但如果我希望网格可用,我不能再简化它。长方体碰撞器仅适用于网格的外部。否?我需要检查网格中代表一个房间的单个三角形,所以我认为这不可用,但我可能错了。你能给我们看看你的网格吗?会更容易找到解决方案K!我贴了一张照片,不确定这是否是你想要的,或者你是否想要实际的文件,但是。。很难想象你会使用网格碰撞器。通常,在游戏工程中,永远不要使用网格碰撞器。(它们只有一两个不寻常的用途。)你能详细说明一下吗?我使用它们(因为应该只有一个),因为这是在unity中进行光线跟踪的最简单的方法。为什么你提到它是一个“tango”平板?我的意思是,我现在对其中一个感兴趣,但为什么呢?:)