Beispiel #1
0
    /// <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);
        }
    }
Beispiel #2
0
    /// <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);
    }