我正在开发一个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(假):
在这里,相同,但是立方体是运动学的,并且可以很好地检测到地面:
我真的不知道为什么要这样做,或者如果我的地面检测功能有问题,欢迎大家提供帮助。 谢谢!
PS:我正在使用Unity 2018.2.15f1
答案 0 :(得分:1)
有很多方法可以检测播放器是否接地。如果raycast,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");
}
}
请注意,这是在检查“地面”标签,因此您的地面对象必须在“地面”标签上。您必须从编辑器手动创建此标签,然后将地面对象标签更改为此。