对象仍然与光线投射发生碰撞,不明白为什么

Objects are still colliding with raycast, don't understand why

在我的场景中有几辆汽车,都标有汽车。他们有一个名为 Driving 的脚本,我不明白为什么他们有时仍然会在前面有车的情况下撞车。这些汽车只附有脚本和一个盒子对撞机。我做错了什么?

    Ray stopray = new Ray(transform.position, transform.forward);
    RaycastHit stophit;

    Ray carray = new Ray(transform.position, transform.forward);
    RaycastHit carhit;

    //here we have to slow down
    if (Physics.Raycast(carray, out carhit, 50) && carhit.transform.gameObject.tag == "car")
    {
        if (carhit.distance < 50 && carhit.distance> 12)
        {
            transform.Translate(0, 0, speed / 6 * Time.deltaTime);
        }
    }

    if (Physics.Raycast(carray, out carhit, 12) && carhit.transform.gameObject.tag == "car" || Physics.Raycast(stopray, out stophit, 8) && stophit.transform.gameObject.tag == "stop")
    {
        // Here we have to stop
        if (carhit.distance < 12)
        {
            transform.Translate(0, 0, 0);
        }

    }
    else
    {
        transform.Translate(0, 0, speed * Time.deltaTime);
    }

(地图上还有看不见的停止立方体) 它最终会变成这样,这不应该发生:

问题解决:光线从车底下一直没看到,解决方法:

        Ray carray = new Ray(new Vector3 (transform.position.x, transform.position.y +1, transform.position.z), transform.forward);
    RaycastHit carhit;

现在光线高了一点,看到了车

检查以确保您的光线投射方向与您确定的方向一致。只要您的光线投射到某处,您就可以简单地在 for 中输入 "Debug" 行。我建议制作一个空白场景,然后只导入两辆汽车和任何 'ground' 他们用来测试的东西。

某处有文档(我现在似乎找不到)关于如何使光线投射在编辑器中实际绘制为红线,这样您就可以看到发生了什么。

此外,根据您想要的行为类型,您可能需要考虑制作触发对撞机而不是光线投射来检测汽车何时彼此靠得太近。

我建议你引入本地速度变量并根据你的条件初始化它,然后在所有条件检查后只调用一次翻译。试试这个:

Ray stopray = new Ray(transform.position, transform.forward);
RaycastHit stophit;

Ray carray = new Ray(transform.position, transform.forward);
RaycastHit carhit;

// speed for the current frame
var currentSpeed = speed;

//here we have to slow down
if (Physics.Raycast(carray, out carhit, 50) && carhit.transform.gameObject.tag == "car")
{
    if (carhit.distance < 50 && carhit.distance> 12)
    {
        currentSpeed = speed / 6;
    }
}

if (Physics.Raycast(carray, out carhit, 12) && carhit.transform.gameObject.tag == "car" || Physics.Raycast(stopray, out stophit, 8) && stophit.transform.gameObject.tag == "stop")
{
    // Here we have to stop
    if (carhit.distance < 12)
    {
        currentSpeed = 0f;
    }
}

// move the car with right speed
transform.Translate(0, 0, currentSpeed * Time.deltaTime);