/// <summary> /// Coorutina encargada de realizar todo el movimiento del jugador avisando al game manager cuando se deben mover los enemigos /// </summary> /// <returns></returns> private IEnumerator MakePath() { // Informamos de que el jugador se esta moviendo isMoving = true; board.ResetMaterial(path[0]); for (int i = 0; i < path.Count - 1; i++) { // Obtenemos el indice de la casilla a la que queremos ir a partir de la casilla acutal y la casilla a la que miramos int objectiveIndex = path[i + 1]; // Rotamos hacia dicha casilla si es necesario Vector3 lookAt = board.IndexToPosition(objectiveIndex, gameObject); // Comprobamos si hace falta girar o no if (Vector3.Distance(transform.position + transform.forward, lookAt) > 0.001f) { yield return(StartCoroutine(RotateOverTimeCoroutine(this.gameObject, rotationTime, transform.rotation, Quaternion.LookRotation(lookAt - transform.position, transform.up)))); } // Miramos si hay un enemigo en dicha casilla if (board.isEnemyPos(objectiveIndex)) { StartCoroutine(gameManager.ResetBoard()); } // Obtenemos tambien el coste de dicha casilla float cost = board.CostToEnter(tileIndex, objectiveIndex, recogerCable); if (cost > Ap) { break; } else { // Llamamos a la corutina para que se encargue del movimiento yield return(StartCoroutine(MoveOverTimeCoroutine(this.gameObject, moveTime, transform.position, board.IndexToPosition(objectiveIndex, gameObject)))); if (i == path.Count - 2) { board.RemoveMaterial(objectiveIndex, selectedMaterial); } else { board.RemoveMaterial(objectiveIndex, cursorMaterial); } // Miramos si la casilla en la que entramos tiene particuals de datos o no esto lo podemos ver con el coste if (cost > 0) { // Spawneamos las particulas board.SpawnParticle(tileIndex, recogerCable); } else if (cost < 0 && recogerCable) { // Eliminamos la particula board.DespawnParticle(objectiveIndex); } // Cambiamos a casilla en la que estamos y el coste tileIndex = objectiveIndex; if (maxAP != 0) { ChangeAP((int)-cost); } } // Comprobamos si hemos llegado a la casilla objetivo if (endIndex.Contains(tileIndex)) { gameManager.BoardCompleted(); } yield return(StartCoroutine(gameManager.EnemyTurn())); yield return(new WaitForSeconds(0.05f)); } RestartPath(); isMoving = false; yield return(null); }