是否可以在运行时使网格上的三角形透明?

Is it possible to make a triangle on a mesh transparent at runtime?

我在 Unity 中有一个程序生成的平面网格。我在运行时发送光线投射,它会与网格中的特定三角形发生碰撞,并使用 RaycastHit 的 triangleIndex 字段获取三角形的索引。

我想让一个三角形在运行时光线投射到它时变得透明。执行此操作的最佳方法是什么?

您可以获得游戏对象或网格渲染器;然后禁用其上的网格渲染器或禁用整个游戏对象。

[SerializeField]
private MeshRenderer obj;


// in your other function you would then run after the raycast hits
obj.enabled = false;

如果它有一个你仍然想要的盒子碰撞器,你就不会禁用整个对象

您必须访问网格的三角形,更改该数组,以便您尝试使其透明的三角形实际上从网格中移除,据我所知,这是唯一的方法。

var tris = mesh.triangles;
tris[yourTriangle] = null;
mesh.triangles = tris;

抱歉,我无法测试此代码。

好的,我明白了。虽然这确实会创建垃圾三角形,但您可以将适当的 tris 设置为 0,这意味着三角形的三个顶点将指向索引 0 处的顶点。

var tris = mesh.triangles;
tris[idx] = 0;
tris[idx + 1] = 0;
tris[idx + 2] = 0;
mesh.triangles = tris;

由于访问和重置 mesh.triangles 的计算量很大,我还在启动时存储了网格的三角形。这样,我不需要访问 mesh.triangles 来更改它。