/// <summary> /// La funcion se encarga de crear el camino que seguira el enemigo a partir de los waypoints y si el camino es cerrado o no /// </summary> private void CreatePath() { // Añadimos la posicion actual como inicial en el camino path.Add(transform.position); // Para cada waypoint calculamos su camino al siguiente for (int i = 0; i < wayPoints.Length - 1; i++) { // Aplicando el A estrella obtenemos un camino List <int> waypointPath = board.AStarAlgorithm(board.PositionToIndex(wayPoints[i].position), board.PositionToIndex(wayPoints[i + 1].position)); // Añadimos todos estos indices al final de nuestro path foreach (int index in waypointPath) { path.Add(board.IndexToPosition(index, gameObject)); } } if (closedPath) { // Aplicando el A estrella obtenemos un camino List <int> waypointPath = board.AStarAlgorithm(board.PositionToIndex(wayPoints[wayPoints.Length - 1].position), board.PositionToIndex(wayPoints[0].position)); // Añadimos todos estos indices al final de nuestro path foreach (int index in waypointPath) { path.Add(board.IndexToPosition(index, gameObject)); } // Si el camino es cerrado eliminamos el ultimo punto ya que es el inicial path.RemoveAt(path.Count - 1); } }
void FixedUpdate() { if (canPlay) { // Elegimos el rayo que vamos a usar para el raycast cameraRay = Camera.main.ScreenPointToRay(Input.mousePosition); // Hacemos el raycast y vemos si hemos golpeado alguna casilla if (Physics.Raycast(cameraRay, out cameraHit) && !EventSystem.current.IsPointerOverGameObject() && !isMoving) { if (cameraHit.collider.name.Contains("Plataforma")) { actualHit = board.PositionToIndex(cameraHit.point); if (board.isTile(actualHit)) { if (previousHit != actualHit) { // Vaciamos el camino anterior RestartPath(); // Calculamos el camino path.AddRange(board.AStarAlgorithm(path[path.Count - 1], actualHit, false)); // Dibujamos el camino DrawPath(); // Guardamos el indice de la casilla cambiada previousHit = actualHit; } } else if (previousHit != -1) { // Cambiamos el material de la anterior casillas board.RemoveMaterial(path[path.Count - 1], selectedMaterial); path.ForEach(tile => board.RemoveMaterial(tile, cursorMaterial)); previousHit = -1; path.Clear(); } } } else if (previousHit != -1 && path.Count > 1) { board.RemoveMaterial(path[path.Count - 1], selectedMaterial); path.ForEach(tile => board.RemoveMaterial(tile, cursorMaterial)); previousHit = -1; path.Clear(); } } }