Unity 3d中的Raycast没有检测到所有障碍物

时间:2018-05-27 15:56:01

标签: c# unity3d raycasting

我试图用球体做一个非常简单的比赛,但是,我遇到了很多问题。

首先,我试图为对手制作一个非常简单的AI系统。

我在这里遇到的问题是,我希望对手能够发现障碍并避免使用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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以使用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;
    }
}

如果它是左侧或右侧,您也可以考虑使用光线投射两条光线来检测倾斜的方向。

答案 2 :(得分:0)

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

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

祝你好运!