c# - 检测玩家是否降落在带有刚体的盒子上
问题描述
我正在开发一个 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
解决方案
有很多方法可以检测玩家是否接地。如果 raycast、SphereCast 和其他基于光线的检测 API 无法正常工作,请尝试不同的方法。使用回调函数,例如OnCollisionEnter
and OnCollisionExit
with 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");
}
}
请注意,这是检查“地面”标签,因此您的地面对象必须位于“地面”标签上。您必须从编辑器手动创建此标签,然后将您的地面对象标签更改为此。
推荐阅读
- javascript - 使用 momentjs 转换天数以获取两个日期的小时、分钟和秒
- php - 我想要一个数组列表中的 php api 响应
- angular - Mat-图标名称列表
- scala - 如何使用scala替换txt文件中的特定文本
- android - 无法访问 TimePickerDialog 中的 onTimeSet 方法
- html - 链接以自动填充另一个页面中的输入框
- python - 如何处理和保存来自传感器的连续数据
- java - 使用 Edittext 实现搜索视图的功能
- python - 出现错误:django.core.exceptions.ImproperlyConfigured:django 中的 SECRET_KEY 设置不能为空
- javascript - 为什么我的 php 代码出现服务器 500 错误