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

时间:2018-11-19 15:25:44

标签: c# unity3d rigid-bodies

我正在开发一个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.groundRoofCheckDistance设置为0.01f。

直到那里,一切正常。但是现在,当我尝试使用非运动刚体在多维数据集之上时,我无法使该布尔值成立。

这里有两个截图来说明我的问题:

在此示例中,玩家跌落在非运动学的刚体盒子上,红色圆圈的布尔值是m_isGrounded(假):

enter image description here

在这里,相同,但是立方体是运动学的,并且可以很好地检测到地面:

enter image description here

我真的不知道为什么要这样做,或者如果我的地面检测功能有问题,欢迎大家提供帮助。 谢谢!

PS:我正在使用Unity 2018.2.15f1

1 个答案:

答案 0 :(得分:1)

有很多方法可以检测播放器是否接地。如果raycast,SphereCast和其他基于射线的检测API无法正常工作,请尝试其他操作。使用带有标志的回调函数,例如OnCollisionEnterOnCollisionExit。检查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");
    }
}

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