我正在尝试创建弯曲射线,并需要列出弯曲射线击中的对象。我可以使用Debug.DrawRay()绘制弯曲的射线。但是,当我为DrawRay()提供与Raycast()相同的参数时,它会创建非常不同的Ray(我想是因为我看不到Ray)。 Raycast()的Ray击中了我在图像中突出显示的对象。但是DrawRay()的Ray太远,无法命中突出显示的对象。如何使它们创建相同的射线?
c# - Unity Raycast()和DrawRay()使用相同的输入创建不同的光线-LMLPHP

//Here is the code:

public void CurveCast(Vector3 origin, Vector3 direction, Vector3 gravityDirection, int smoothness, float maxDistance, float direction_multiply, float radius)
{
    Vector3 currPos = origin, hypoPos = origin, hypoVel = (direction.normalized / smoothness) * direction_multiply;
    List<Vector3> v = new List<Vector3>();
    float curveCastLength = 0;

    Ray ray;
    RaycastHit hit;
    hit_list = new List<RaycastHit>();
    while (curveCastLength < maxDistance)
    {
        ray = new Ray(currPos, hypoVel);

        Debug.DrawRay(currPos, hypoVel, Color.white);
        if (Physics.Raycast(currPos, hypoVel, out hit)) // if (Physics.SphereCast(ray, radius, out hit,maxDistance))
        {
            hit_list.Add(hit);
        }


        v.Add(hypoPos);
        currPos = hypoPos;
        hypoPos = currPos + hypoVel + (gravityDirection * Time.fixedDeltaTime / (smoothness * smoothness));
        hypoVel = hypoPos - currPos;
        curveCastLength += hypoVel.magnitude;
    }
}

最佳答案

这是因为Debug.DrawRayPhysics.Raycast不完全相同。

Debug.DrawRay中,射线的长度由矢量幅度定义。您可以see it in the doc


  在世界坐标中从头开始绘制一条线+ dir。


对于Physics.Raycast,射线的长度与方向无关,可以将其设置为参数。它的默认值是无穷大,因此,如果您没有定义它,则即使方向矢量很短,光线投射也将变为无穷大。 See the doc


  从点原点向方向投射最大长度为maxDistance的射线,对场景中的所有碰撞体。


因此,为您解决的方法是给Raycast函数适当的距离:

Debug.DrawRay(currPos, hypoVel, Color.white);
if (Physics.Raycast(currPos, hypoVel, out hit, hypoVel.magnitude())) // if (Physics.SphereCast(ray, radius, out hit,maxDistance))
{
    hit_list.Add(hit);
}

关于c# - Unity Raycast()和DrawRay()使用相同的输入创建不同的光线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53172986/

10-10 10:25