首页 > 解决方案 > 检测玩家是否降落在带有刚体的盒子上

问题描述

我正在开发一个 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 (false):

在此处输入图像描述

在这里,同样的,但立方体是运动的,并且检测到地面就好了:

在此处输入图像描述

我真的不知道为什么刚体会这样做,或者我的地面检测功能是否有问题,所以欢迎任何帮助。谢谢!

PS:我使用的是 Unity 2018.2.15f1

标签: c#unity3drigid-bodies

解决方案


有很多方法可以检测玩家是否接地。如果 raycast、SphereCast 和其他基于光线的检测 API 无法正常工作,请尝试不同的方法。使用回调函数,例如OnCollisionEnterand OnCollisionExitwith flag。检查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");
    }
}

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


推荐阅读