检测玩家是否落在带有刚体的盒子顶部
Detect if the player is landed on top of a box with rigidbody
我正在开发一个 Unity 游戏,玩家在这个游戏中射击立方体以改变它们的重量(它可以是正的也可以是负的,最后一个意味着 'falling' 到屋顶)我遇到了一个问题使用刚体、球体投射和检测玩家是否着陆。
当我的玩家在地面上或任何带有碰撞器的物体顶部时,我使用以下函数将其检测为 'grounded':
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(假):
在这里,相同,但立方体是运动的,地面检测得很好:
我真的不明白为什么刚体会那样做,或者如果我的地面检测功能有问题,欢迎任何帮助。
谢谢!
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");
}
}
请注意,这是在检查 "Ground" 标签,因此您的地面对象必须在 "Ground" 标签上。您必须从编辑器中手动创建此标签,然后将您的地面对象标签更改为此。
我正在开发一个 Unity 游戏,玩家在这个游戏中射击立方体以改变它们的重量(它可以是正的也可以是负的,最后一个意味着 'falling' 到屋顶)我遇到了一个问题使用刚体、球体投射和检测玩家是否着陆。
当我的玩家在地面上或任何带有碰撞器的物体顶部时,我使用以下函数将其检测为 'grounded':
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(假):
在这里,相同,但立方体是运动的,地面检测得很好:
我真的不明白为什么刚体会那样做,或者如果我的地面检测功能有问题,欢迎任何帮助。 谢谢!
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");
}
}
请注意,这是在检查 "Ground" 标签,因此您的地面对象必须在 "Ground" 标签上。您必须从编辑器中手动创建此标签,然后将您的地面对象标签更改为此。