Answers:
正如我在评论中所说,您将要查找组成游戏对象下三角形的所有顶点,并将其y值设置为相同的值。
我将通过更详细的步骤来扩展我的评论。我对Unity不太熟悉,所以我不知道要使用哪种最佳工具,但是我相信我可以帮助您正确地开始工作。
蛮力法:
对于击中物体的每条光线,您可以使用以下内容在地形网格中获取三角形:
RaycastHit hit;
if (!Physics.Raycast(camera.ScreenPointToRay(Input.mousePosition), out hit))
return;
MeshCollider meshCollider = hit.collider as MeshCollider;
if (meshCollider == null || meshCollider.sharedMesh == null)
return;
Mesh mesh = meshCollider.sharedMesh;
Vector3[] vertices = mesh.vertices;
int[] triangles = mesh.triangles;
Vector3 p0 = vertices[triangles[hit.triangleIndex * 3 + 0]];
Vector3 p1 = vertices[triangles[hit.triangleIndex * 3 + 1]];
Vector3 p2 = vertices[triangles[hit.triangleIndex * 3 + 2]];
p0,p1和p2是构成被命中三角形的三个顶点的所有位置。您想要将每个顶点位置调整为具有相同的y
值。您可以收集所有顶点,然后将它们全部设置为平均值y
,或者可以使用y
放置游戏对象时发现的初始拾取值。
优化:
您不仅可以投射光线网格,还可以将碰撞器从游戏对象上扫下,并收集游戏对象碰撞器与地形碰撞网格之间的碰撞接触点。然后,对于每个这些接触点,执行上面的步骤以获取要移动的顶点。
以这样的方式创建地形,即每个顶点x
和z
值与网格对齐,并且其y
值仅变化。现在,您可以轻松获取游戏对象的边界,并更改这些边界内所有顶点的y值。
最后的优化实际上是一种可能易于实现且相当有效的替代方法。