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