首页 > 解决方案 > 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)))

标签: c#unity3d

解决方案


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不会触发触发器,但使用此参数,您可以覆盖它并告诉它触发触发器。

阅读这些部分并检查以确保您所做的与我所描述的相符。如果您仍然无法根据我所写的内容弄清楚您的问题,我需要更多地了解您的情况以提供帮助。


推荐阅读