c# - Unity Physics.Raycast 在应该检测到对象时未检测到
问题描述
我正在制作一个 2D 游戏,我正在使用 Raycast 来检测玩家是否在地面上。无论如何,Raycast 总是返回 false。我使用了 Debug.DrawRay,它显示光线正在撞击地面。我尝试了几个不同教程的解决方案,但没有任何效果。我对 Unity 很陌生,所以希望有经验的人知道出了什么问题。
if (Physics.Raycast(transform.position, transform.TransformDirection(-Vector3.down), DistanceDown, LayerMask)){
Debug.Log("Grounded");
return true;
}
else
{
Debug.Log("Not Grounded");
return false;
}
修改后的代码:
if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.down), (float)(GetComponent<Collider2D>().bounds.extents.y + Offset)))
解决方案
Raycast 有几个参数。我将解释每一个,因为可能有几个原因说明它为什么不起作用,所以可能打破它可以帮助你意识到哪里出了问题。
Raycast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
原点是光线将从空间中开始的点。目前,您将其设置为transform.position
,因此它将从脚本所在的位置开始,很可能是您的播放器。
方向是一个应该归一化的向量,因此没有比例来确定应该从原点投射光线的位置。现在您正在使用-Vector3.down
,这将导致Vector3.Up
上下是相反的,因此否定一个会给出另一个。对于地面检查,我会使用Vector3.down
地面通常低于或低于玩家的原点。
maxDistance是投射光线的长度。现在你有它DistanceDown
,我假设它是一些浮动的。通常,对于地面检查,我会使用您角色的对撞机,然后添加一些偏移量以确定何时接地。类似的东西GetComponent<Collider>().bounds.extents.y + OFFSET
。bounds.extents.y 是对撞机大小的一半,因为你的原点是你的玩家的中心,它应该落在你的对撞机的脚或底部,这就是你需要偏移的原因。
图层蒙版用于在投射时忽略特定图层。当您只想投射并击中单个图层时,它非常有用,在您的情况下可能只是地面。我没有看到这方面的代码,但我会提供一个例子,以防你出错。LayerMask mask = LayerMask.GetMask("GroundLayer");
并mask
用作你的面具。现在光线只会照射到图层上的物体GroundLayer
。
您未使用的最后一个参数称为queryTriggerInteraction。默认情况下,Raycast不会触发触发器,但使用此参数,您可以覆盖它并告诉它触发触发器。
阅读这些部分并检查以确保您所做的与我所描述的相符。如果您仍然无法根据我所写的内容弄清楚您的问题,我需要更多地了解您的情况以提供帮助。
推荐阅读
- web-crawler - 如何获得股票或证券的实时价值?
- python - 这个用于车辆路由的 Python/Google OR 工具程序是否有一个简单的修复程序以使其按预期工作?
- php - 如何在 php codigniter 中插入数组的键和值
- c++ - 关于在 C++ 中初始化指针
- python - 给定一个词根,我如何在 Python 中获得它的变体?
- php - PHP-FPM 停止响应 aws [上游超时(110:连接超时)]
- java - Jib 插件无法访问由另一个 Gradle 插件更新的 project.version
- html - 如何在移动视图中删除网站右侧的额外空白
- java - 比较器声明语法
- python - AttributeError:模块“blog.views”没有属性“new_comment”