【问题标题】:Detect if the player is landed on top of a box with rigidbody检测玩家是否落在带有刚体的盒子上
【发布时间】:2018-11-19 15:25:43
【问题描述】:

我正在开发一个 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# unity3d rigid-bodies


    【解决方案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");
        }
    }
    

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

    【讨论】:

    • 我试过了,花了一天时间调整我的其余代码,但它现在可以工作了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多