Unity3d - 获取旋转对象的GameObject高度

时间:2018-05-09 12:35:05

标签: c# unity3d

我想获得GameObject的高度。我尝试过:

this.GetComponent<MeshRenderer>().bounds.size.y

但边界问题是它只适用于静态对象。当你有一个移动的物体并且如果物体的旋转没有完全对齐时,边界(高度)就不再准确了,因为它返回了一个正方形边界的高度,如果你像一块板一样倾斜一个物体边界高度不准确对象的高度。

它是一个轴对齐的边界框(也称为&#34; AABB&#34;)。

请检查我附上的图像,在那里你可以看到移动物体的问题,如果你旋转它们,高度就不再准确了。

enter image description here

有没有其他人有这种问题?

有关如何准确获取物体高度的任何建议吗?

2 个答案:

答案 0 :(得分:5)

一种选择是使用游戏对象的对手。

您可以相对轻松地找到对撞机的高度和宽度,因此这是一种可以测量游戏对象尺寸的方法。对撞机,例如游戏对象上的盒子对撞机,将必须完全包围该对象。您可以执行此操作来调整对撞机的大小,直到它紧紧包裹您的游戏对象。然后,当您想要找到对象的某个维度而不是在对撞机上找到该维度并乘以Game Object的transform.scale时。

以下是我测试过的一些例子。

示例1:

CapsuleCollider m_Collider = GetComponent<CapsuleCollider>();
var height = m_Collider.height  * transform.localScale.y;

https://docs.unity3d.com/ScriptReference/CapsuleCollider-height.html

示例2:

   BoxCollider m_Collider = GetComponent<BoxCollider>();
   var height = m_Collider.size.y  * transform.localScale.y;
   var width = m_Collider.size.x  * transform.localScale.x;
   var breadth = m_Collider.size.z  * transform.localScale.z;

https://docs.unity3d.com/ScriptReference/BoxCollider-size.html

希望其中一个适合你。

如果没有,那么您可以找到高度的第二个不方便的方法是在对象的顶部和底部创建2个代理对象作为子对象。然后找到它们之间的标量距离。

答案 1 :(得分:3)

解决方案1:使用Mesh.bounds

您可以使用Mesh.bounds获得身高。与MeshRenderer.bounds(或Renderer.bounds)不同,这是网格在其局部空间中的轴对齐边界框(即不受变换影响)。

您仍然需要使用transform.lossyScale来说明GameObject的比例,如下所示:

public class Example : MonoBehaviour
{
    private Mesh _mesh;

    private void Awake()
    {
        _mesh = GetComponent<MeshFilter>().mesh;
    }

    private void Update()
    {
        float height = _mesh.bounds.size.y * transform.lossyScale.y;
        Debug.Log(height);
    }
}

(请注意,使用transform.lossyScale时,该值可能会略微不准确。如果您需要极高的准确度,请注意这一点。请参阅the documentation on transform.lossyScale:)

  

请注意,如果您有一个带缩放的父变换和一个孩子   任意旋转,比例将会歪斜。因此规模可以   不能在3分量矢量中正确表示,而只能在3x3中表示   矩阵。这样的表示非常不方便使用   然而。 lossyScale是一个试图匹配的便利属性   实际的世界规模尽可能多。如果您的对象不是   倾斜的价值将是完全正确的,很可能是价值   如果它也包含歪斜也不会有很大不同。

解决方案2(解决方法):缓存未旋转的MeshRenderer边界

或者,如果在您的上下文中您可以在没有轮换的情况下实例化GameObject,并且您只需要在初始化后旋转GameObject,则一种解决方法是从{{1}缓存边界在MeshRenderer方法中,如下所示:

Awake