为具有许多顶点的网格创建单个MeshCollider

时间:2016-05-04 08:06:37

标签: c# unity3d

我正在使用统一的网格进行一些计算,并添加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;
}

这显然不适用于几个网状部件,因为碰撞器会被覆盖。由于网格很大,我不能将网格合并在一起并设置一个对撞机,对吧?当我在统一中使用Generate Colliders框时,它工作正常,但我想要一个可编程的解决方案,因为我要在运行时生成网格。

有没有人知道如何为大网格制作单个对撞机,由于有许多顶点,大网格被分成几个部分?

这是一张网格图片(根据要求)它可能看起来很奇怪,但它是(办公楼)的一部分。我自己用Tango平板电脑做了网。我没有包括探戈标签,因为我没想到网格看起来会如何影响答案。

enter image description here

2 个答案:

答案 0 :(得分:1)

说实话,我并不完全理解你的情况,但如果你需要一个可以覆盖从脚本创建的复杂对象的对撞机,你仍然可以在运行时将它分别添加到每个对象,对吧?而不是

testRoom.AddComponent<MeshCollider>();
testRoom.GetComponent<MeshCollider>().sharedMesh = _filter.mesh;

你可以做到

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

无论如何,你无法向gameObject添加多个MeshFilter组件,因此从testRoom.GetComponentsInChildren()获得的任何过滤器都会附加到另一个对象。因此,您可以单独为每个碰撞器添加新碰撞器。

答案 1 :(得分:0)

您当然可以在运行时添加碰撞器,就像您现在一样。这将为您提供非常繁重且性能较差的解决方案,该解决方案可以正常运行在这种情况下,通常的做法是建模您将用作对撞机的网格的低聚版本。

如果你的物品太复杂,另一个解决方案就是箱子碰撞器。你需要抓住renderer.bounds http://docs.unity3d.com/ScriptReference/Renderer-bounds.html 并使用该边界创建新的盒子对撞机 http://docs.unity3d.com/ScriptReference/Collider-bounds.html

希望有意义