Raycast,在 Unity 3d 中无法检测到所有障碍物

Raycast, in Unity 3d does not detect all obstacles

我正在尝试用球体制作一个非常简单的赛车游戏,但是,我遇到了很多问题。

首先,我正在尝试为对手制作一个非常简单的人工智能系统。

我这里的问题是我想让对手检测障碍物并使用 Raycast 避开它们,但只检测到某种类型的障碍物,一个简单的立方体。

我创建了一个简单的球体作为对手并编写了一个脚本以便它可以移动和检测障碍物 这是更新函数:

void FixedUpdate()
{
    transform.Translate(Vector3.forward * Time.deltaTime * speed);

    if (Physics.Raycast(transform.position, transform.forward, 100.0f))
        print("There is something in front of the object!");

}

只有在前方有立方体且未检测到任何其他障碍物时才会打印该消息。有什么错?另外,当对手光线投射障碍物时,是否知道如何向左或向右移动?

obstacle that is detected

hierarchy

cube01 that is child of obstacle2 that is not detected

你可以用Debug.DrawLine() 或Debug.DrawLine() 来调试线路,看看它是否越过障碍物。 这是他们的文档 DrawRay DrawLine 对于左右移动,我想你可以添加这样的东西

void FixedUpdate()
{
    Vector3 dir = Vector3.forward * Time.deltaTime * speed;
    if (Physics.Raycast(transform.position, transform.forward, 100.0f))
    {
        print("There is something in front of the object!");
        dir += Vector3.Right * horizontalSpeed * Time.deltaTime;
    }
}

您也可以考虑投射两条光线来检测倾斜的方向,是向左还是向右。

使用光线投射仅检测碰撞器组件,确保您有合适的碰撞器(碰撞器的大小不一定与渲染的网格大小匹配)。通常对象所在的图层也很重要,但您使用的语法无论如何都不会检查图层蒙版

Unity Physics 最佳实践(如 https://unity3d.com/pt/learn/tutorials/topics/physics/physics-best-practices 中)建议我们不要在 FixedUpdate 中使用 Raycasts,因为它处理起来很繁重并且可能并不总是有效。

还有一些关于矩阵层的技巧,可以帮助您提高性能并避免此类错误。

祝你好运!