示例#1
0
    public void Update()
    {
        Ray  ray;
        bool visualize = false;

        if (Input.GetMouseButtonDown(0))
        {
            // была нажата левая кнопка мыши
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        }
        else if (Input.GetMouseButtonDown(1))
        {
            // была нажата правая кнопка мыши
            visualize = true;             // также отобразим как алгоритм работал
            ray       = Camera.main.ScreenPointToRay(Input.mousePosition);
        }
        else if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
        {
            // произошло касание по экрану (телефона)
            ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
        }
        else
        {
            // досрочно завершаем процедуру во всех остальных случаях
            return;
        }

        // Пытаемся найти точку на слое "Floor" на который пришлось нажатие
        int        floor = LayerMask.GetMask(new string[] { "Floor" });
        RaycastHit hit   = new RaycastHit();

        if (!Physics.Raycast(ray, out hit, float.PositiveInfinity, floor))
        {
            // Если нажали не на пол досрочно завершаем процедуру
            return;
        }

        // Инициализируем вершину начала пути = текущему положения объекта
        Point source = labirynth.GetPoint(transform.position);
        // Инициализируем вершину конца пути = точка нажатия
        Point      destination = labirynth.GetPoint(hit.point);
        PathFinder finder      = GetPathFinder(pathFinder);

        if (visualize)
        {
            // Поиск пути и визуализация алгоритма поиска
            labirynth.Record();
            List <Point> path = finder.FindPath(labirynth, source, destination);
            List <Point> algo = labirynth.StopRecord();
            _mover.VisualizeAndMove(labirynth, algo, path);
        }
        else
        {
            // Поиск пути и перемещение
            List <Point> path = finder.FindPath(labirynth, source, destination);
            _mover.Move(labirynth, path);
        }
    }
示例#2
0
    public List <Point> FindPath(Labirynth labirynth, Point source, Point destination)
    {
        NavMeshPath navMeshPath = new NavMeshPath();

        NavMesh.CalculatePath(source.position, destination.position, NavMesh.AllAreas, navMeshPath);
        List <Point> path = new List <Point>();

        foreach (Vector3 corner in navMeshPath.corners)
        {
            path.Add(labirynth.GetPoint(corner));
        }
        return(path);
    }