对象仍在与raycast碰撞,不明白为什么

时间:2018-10-04 12:12:59

标签: c# unity3d raycasting

在我的场景中,有几辆汽车都标有汽车。他们有一个叫做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);
    }

(在地图上还有不可见的停止立方体) 它最终会变成这样,并且这种情况不应发生: enter image description here

3 个答案:

答案 0 :(得分:1)

我建议您引入局部速度变量并根据您的条件对其进行初始化,然后在所有条件检查之后仅调用一次translate。试试这个:

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);

答案 1 :(得分:0)

问题解决了:射线进入了车底,却没看见一个,解决方案:

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

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

答案 2 :(得分:0)

检查以确保您的射线广播朝着您肯定认为的方向发展。只要您的射线投射碰到任何东西,您都可以简单地在其中插入“调试”行。我建议创建一个空白场景,然后仅导入两辆汽车以及它们要测试的任何“地面”。

有一些文档(我现在似乎找不到),可以使光线投射在编辑器中以红色线条实际绘制,以便您查看发生了什么。

此外,根据您想要的行为,您可能需要考虑制作触发对撞机,而不是进行光线投射,以检测汽车何时彼此之间过于接近。