You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动