Unity 中的避障,使用光线投射。 C#

Obstacle Avoidance in Unity, using raycasts. C#

我正在使用一些基本的避障算法来避开障碍物,但是左右传感器出现问题。当两者都活跃时。他们将取消轮换,根本不轮换。通过前传感器计算 hit.normals 也有点麻烦。

    ray = new Ray(transform.position + Vector3.up, transform.forward);
    Vector3 posInicial = transform.position;

    if (Physics.Raycast(ray, out hit, 55f)) // Front sensor
    {
        if (hit.collider.tag == ("Pick Up")) // If robot detects pick up, it goes towards it
        {
            Debug.DrawLine(ray.origin, hit.point, Color.red);
            transform.position = Vector3.MoveTowards(transform.position, hit.point, Time.deltaTime * speed);
        }
        else
        {
            transform.Rotate(0, -80 * Time.deltaTime, 0); // Rotate if front sensor doesn't detect pick up
            Debug.DrawLine(ray.origin, hit.point, Color.blue);
        }
    }
    else
    {
        transform.position += transform.forward * speed * Time.deltaTime; // Go forward
        Debug.DrawLine(ray.origin, hit.point, Color.white);
    }
    if (Physics.Raycast(posInicial, Quaternion.AngleAxis(45f, transform.up) * transform.forward, out hit2, 20f))
    {
        transform.Rotate(0, -80 * Time.deltaTime, 0); // Rotate left if right detected
        Debug.DrawLine(posInicial, hit2.point, Color.yellow);
    }
    if (Physics.Raycast(posInicial, Quaternion.AngleAxis(-45f, transform.up) * transform.forward, out hit3, 20f))
    {
        transform.Rotate(0, 80 * Time.deltaTime, 0); // rotate right if detected left
        Debug.DrawLine(posInicial, hit3.point, Color.cyan);
    }
}

我不确定你为什么要尝试自己实现它。如果是因为你对算法感兴趣,想把它外推到未来的现实世界,那也没关系。

但为了以防万一,Unity 中已经有一个叫做 NavMesh 的东西,它基本上为游戏对象(例如敌人)提供了 AI,这使得它们能够识别障碍物,以便在场景中从一个点移动到另一个点时避开它们.

  • Select 应该影响导航的场景几何 - walkable 表面和障碍物。
  • 选中导航静态以在 NavMesh烘焙过程。
  • 调整烘焙设置以匹配您的代理大小。
  • 点击烘焙构建 NavMesh

烘焙场景后,您可以将导航网格添加到游戏对象:

public class EnemyMovement : MonoBehaviour
{
    NavMeshAgent nav; 

    function Awake ()
    {
        nav = GetComponent(NavMeshAgent);
    }

    //So here it will be chasing the player
    function Update ()
    {
        nav.SetDestination (player.position);
    }
}

您可以阅读更多相关内容here and follow this tutorial