C# 检测玩家是否落在带有刚体的盒子顶部

C# 检测玩家是否落在带有刚体的盒子顶部,c#,unity3d,rigid-bodies,C#,Unity3d,Rigid Bodies,我正在做一个Unity游戏,玩家在立方体上射击以改变它们的重量(可以是正的,也可以是负的,最后一个意思是“掉到”屋顶上),我遇到了刚体、球体切割和检测玩家是否被接地的问题 当我的播放机在地面上或任何带有碰撞器的物体顶部时,我使用以下功能将其检测为“接地”: if (Physics.SphereCast(transform.position, m_Capsule.radius, Vector3.down, out hitInfo, ((m_Capsule.height / 2f) - m

我正在做一个Unity游戏,玩家在立方体上射击以改变它们的重量(可以是正的,也可以是负的,最后一个意思是“掉到”屋顶上),我遇到了刚体、球体切割和检测玩家是否被接地的问题

当我的播放机在地面上或任何带有碰撞器的物体顶部时,我使用以下功能将其检测为“接地”:

if (Physics.SphereCast(transform.position, m_Capsule.radius, Vector3.down, out hitInfo, 
    ((m_Capsule.height / 2f) - m_Capsule.radius) + advancedSettings.groundRoofCheckDistance, Physics.AllLayers, QueryTriggerInteraction.Ignore))
    {
        m_IsGrounded = true;
    }
其中
advancedSettings.groundrootCheckDistance
设置为0.01f

在那之前,一切都很好。但是现在,当我试图用一个非运动学的刚体在一个立方体的顶部时,我不能让那个布尔值为真

以下是两个示例来说明我的问题:

在本例中,玩家落在非运动学刚体框上,红色圆圈中的布尔值为m_isGrounded(false):

在这里,相同,但立方体是运动的,地面被检测得很好:

我真的不明白为什么刚体会这样做,或者如果我的地面探测功能有问题,欢迎任何帮助。 谢谢


PS:我使用的是Unity 2018.2.15f1

有很多方法可以检测球员是否停飞。如果光线投射、SphereCast和其他基于光线的检测API工作不正常,请尝试其他方法。使用带有标志的回调函数,如
OnCollisionEnter
OnCollisionExit
。在
Update
功能中检查该标志

bool m_IsGrounded;

void OnCollisionEnter(Collision collision)
{
    if (collision.collider.CompareTag("Ground"))
        m_IsGrounded = true;
}

void OnCollisionExit(Collision collision)
{
    if (collision.collider.CompareTag("Ground"))
        m_IsGrounded = false;
}

void Update()
{
    if (m_IsGrounded)
    {
        Debug.Log("Grounded");
    }
}

请注意,这是在检查“地面”标记,因此地面对象必须位于“地面”标记上。您必须从编辑器中手动创建此标记,然后将地面对象标记更改为此标记。

我尝试过,花了一天的时间修改其余代码,但现在可以使用了。谢谢