Unity3d:如何获取旋转GameObject的准确高度?
解决Unity中旋转/移动物体后准确获取高度的问题
我之前也碰到过完全一样的困扰!用MeshRenderer.bounds.size.y获取高度时,一旦物体旋转或者移动,AABB(轴对齐包围盒)就会“跑偏”——就像你说的倾斜盘子,它的包围盒会沿着世界坐标轴拉伸,返回的高度根本不是物体实际的垂直高度。
下面分享几个靠谱的解决方法,根据你的需求选就行:
1. 获取物体局部空间的原始高度(不受旋转/移动影响)
如果你要的是模型本身的高度(不管物体在世界里怎么摆),直接用Mesh的局部包围盒就可以,它不会受物体的旋转、位移影响,只和模型本身的顶点有关。如果物体有缩放,记得乘以局部缩放值:
// 获取MeshFilter组件 MeshFilter meshFilter = GetComponent<MeshFilter>(); // 模型本身的局部高度 float originalLocalHeight = meshFilter.mesh.bounds.size.y; // 考虑物体的局部缩放,得到实际的局部高度 float actualLocalHeight = originalLocalHeight * transform.localScale.y;
2. 获取世界空间中沿特定轴的实际高度(比如垂直地面的高度)
如果需要的是物体在世界空间里沿某一轴的真实高度(比如倾斜盘子垂直地面的高度),最准确的方式是把所有顶点转换到世界空间,然后计算该轴上的最大最小值差:
MeshFilter meshFilter = GetComponent<MeshFilter>(); Vector3[] localVertices = meshFilter.mesh.vertices; float maxWorldY = float.MinValue; float minWorldY = float.MaxValue; foreach (Vector3 localVert in localVertices) { // 将局部顶点转换为世界空间坐标 Vector3 worldVert = transform.TransformPoint(localVert); // 更新最大、最小Y值 maxWorldY = Mathf.Max(maxWorldY, worldVert.y); minWorldY = Mathf.Min(minWorldY, worldVert.y); } // 世界空间中沿Y轴的实际高度 float worldVerticalHeight = maxWorldY - minWorldY;
这个方法不管物体怎么旋转、移动,都能精准算出沿目标轴的高度,完全贴合物体的实际轮廓。
额外注意事项
- 如果物体有多个子物体,需要遍历所有子物体的MeshFilter,合并计算所有顶点的最大最小轴值;
- 如果你用的是
SkinnedMeshRenderer(比如动画角色),可以通过SkinnedMeshRenderer.sharedMesh获取顶点,或者调用BakeMesh得到实时的顶点数据再计算; - 避免用Collider的bounds,不管是BoxCollider还是MeshCollider,它们的包围盒都是AABB,同样会有旋转后不准确的问题。
内容的提问来源于stack exchange,提问作者Adrian Ivasku




