Beispiel #1
0
    /// <summary>
    /// Actualiza todos los objetos que estan activos actualmente en escena
    /// </summary>
    private void UpdateActive(bool playableLevel)
    {
        activeEnemies.Clear();

        activeWalls.Clear();

        activeTerminals.Clear();

        activeDoors.Clear();


        if (playableLevel)
        {
            // Guardamos los enemigos
            activeEnemies.AddRange(activeBoard.GetBoardEnemies());

            // Guardamos los muros
            activeWalls.AddRange(activeBoard.GetBoardWalls());

            // Guardamos las terminales
            activeTerminals.AddRange(activeBoard.GetBoardTerminals());

            // Guardamos las puertas
            activeDoors.AddRange(activeBoard.GetBoardDoors());
        }

        // Guardamos el jugador
        activePlayer = activeBoard.GetPlayer();

        // Guardamos la camara
        activeCamera = activeBoard.GetCamera();
    }
Beispiel #2
0
    /// <summary>
    /// Funcion encargada de hacer el Setup del Board iniciando todas sus estructuras logicas
    /// </summary>
    /// <param name="manager">Manager del cubo</param>
    /// <param name="playableLevel">Indica si el nivel es de paso o de juego</param>
    public void SetupBoard(BGameManager manager, bool playableLevel)
    {
        // GUardamos el manager
        gameManager = manager;

        // Primero observamos el sistema de coordenadas que vamos a utilizar
        // El sistema elegido dependera de las coordenadas que provengan del boardInfo
        if (boardInfo.x && boardInfo.y)
        {
            coordSys = ECord.XY;
        }
        else if (boardInfo.x && boardInfo.z)
        {
            coordSys = ECord.XZ;
        }
        else if (boardInfo.y && boardInfo.z)
        {
            coordSys = ECord.YZ;
        }
        else
        {
            Debug.LogError("Por favor indique en la informacion del tablero dos coordenadas para el systema de coordenadas");
        }

        // Obtenemos el tamaño de la casilla base y lo guardamos para usarlo mas tarde
        Vector3 tileSize = Tile.GetComponent <Renderer>().bounds.size;

        tileSize1 = (int)tileSize.x;
        tileSize2 = (int)tileSize.z;
        tileSize3 = tileSize.y;

        // Obtenemos todas las casillas de la escena activas
        Object[] boardTiles = GetComponentsInChildren <BTile>();

        // Obtenemos la coordenada de la superficie para poder spawnear particulas mas tarde en esta
        BTile aux = (BTile)boardTiles[0];

        switch (coordSys)
        {
        case ECord.XY:
            surfaceCoord = aux.gameObject.transform.position.z + aux.transform.up.z * tileSize3 / 2;
            break;

        case ECord.XZ:
            surfaceCoord = aux.gameObject.transform.position.y + aux.transform.up.y * tileSize3 / 2;
            break;

        case ECord.YZ:
            surfaceCoord = aux.gameObject.transform.position.x + aux.transform.up.x * tileSize3 / 2;
            break;

        default:
            break;
        }

        // A partir de todas estas casillas obtenemos sus posiciones en el sistema
        List <float> firstPositions  = new List <float>();
        List <float> secondPositions = new List <float>();

        foreach (BTile item in boardTiles)
        {
            // Dependiendo del sistema de coordenadas guardamos unos valores diferentes
            switch (coordSys)
            {
            case ECord.XY:
                firstPositions.Add(item.gameObject.transform.position.x);
                secondPositions.Add(item.gameObject.transform.position.y);
                break;

            case ECord.XZ:
                firstPositions.Add(item.gameObject.transform.position.x);
                secondPositions.Add(item.gameObject.transform.position.z);
                break;

            case ECord.YZ:
                firstPositions.Add(item.gameObject.transform.position.y);
                secondPositions.Add(item.gameObject.transform.position.z);
                break;

            default:
                break;
            }
        }

        // Guardamos la posicion minima para usarla mas tarde
        min1 = firstPositions.Min();
        min2 = secondPositions.Min();
        max1 = firstPositions.Max();
        max2 = secondPositions.Max();

        // Calculamos el tamaño del tablero a partir de las posiciones y de los tamaños
        size1 = Mathf.RoundToInt((max1 - min1) / tileSize1) + 1;
        size2 = Mathf.RoundToInt((max2 - min2) / tileSize2) + 1;

        // Spawneamos el plano de collision para detectar los clicks
        SpawnCollisionPlane();

        // Premaramos el diccionario con las diferentes direcciones
        indexDirections.Add("Up", size1);
        indexDirections.Add("Down", -size1);
        indexDirections.Add("Left", -1);
        indexDirections.Add("Right", 1);

        //Para cada casilla almacenamos su posicion y como referente guardamos su indice en el array
        foreach (BTile item in boardTiles)
        {
            //Calculamos el nuevo indice para guardar en el diccionario de localizaciones
            Vector3 position    = item.gameObject.transform.position;
            int     firstIndex  = 0;
            int     secondIndex = 0;

            switch (coordSys)
            {
            case ECord.XY:

                // Calculamos los indices respecto a las posiciones
                firstIndex  = Mathf.RoundToInt((position.x - min1) / tileSize1);
                secondIndex = Mathf.RoundToInt((position.y - min2) / tileSize2) * size1;
                // Guardamos en el diccionario el index con su respectiva posicion
                locations.Add((firstIndex + secondIndex), new Vector2(position.x, position.y));
                tiles.Add((firstIndex + secondIndex), item);
                break;

            case ECord.XZ:

                // Calculamos los indices respecto a las posiciones
                firstIndex  = Mathf.RoundToInt((position.x - min1) / tileSize1);
                secondIndex = Mathf.RoundToInt((position.z - min2) / tileSize2) * size1;
                // Guardamos en el diccionario el index con su respectiva posicion
                locations.Add((firstIndex + secondIndex), new Vector2(position.x, position.z));
                tiles.Add((firstIndex + secondIndex), item);
                break;

            case ECord.YZ:

                // Calculamos los indices respecto a las posiciones
                firstIndex  = Mathf.RoundToInt((position.y - min1) / tileSize1);
                secondIndex = Mathf.RoundToInt((position.z - min2) / tileSize2) * size1;
                // Guardamos en el diccionario el index con su respectiva posicion
                locations.Add((firstIndex + secondIndex), new Vector2(position.y, position.z));
                tiles.Add((firstIndex + secondIndex), item);
                break;

            default:
                break;
            }

            //Guardamos el indice de la casilla inicial y final
            if (item.currentState == BTile.ETileState.Start)
            {
                startIndex = firstIndex + secondIndex;
            }
            else if (item.currentState == BTile.ETileState.End)
            {
                endIndex.Add(firstIndex + secondIndex);
            }
        }

        // Para cada casilla almacenamos sus bordes usando como referente su indice en el array
        foreach (int index in locations.Keys)
        {
            // Llamamos a la funcion CreateLocalEdges que nos devuelve los bordes del indice
            edges.Add(index, CreateLocalEdges(index));
        }

        // Añadimos los bordes de las paredes
        AddWallsEdges();

        // Ponemos a 0 los bordes del tablero
        SetBorderEdges();


        // Obtenemos la posicion y rotacion para instanciar al jugador
        Vector3 playerPos = GetPlayerSpawnPos(boardInfo.player.GetComponent <Renderer>().bounds.size.y);

        Quaternion playerRot = GetPlayerSpawnRot();

        // Instanciamos al jugador
        GameObject playerGO = Instantiate(boardInfo.player, playerPos, playerRot);

        // Obtenemos el script del jugador y lo guardamos
        player = playerGO.GetComponent <BPlayer>();

        player.transform.parent = this.transform;

        // Hacemos el setup del jugador
        player.SetupPlayer(manager, playerInfo, endIndex);

        // Obtenemos la roatacion de los elementos del tablero para cuando spawneemos particulas
        spawnRotation = player.transform.rotation;

        if (playableLevel)
        {
            // Obtenemos todos los enemigos y los guardamos en la lista
            foreach (BEnemy enemy in GetComponentsInChildren <BEnemy>())
            {
                enemy.SetupEnemy(manager);
                enemiesPos.Add(enemy.GetEnemyIndex());
            }

            // Iniciamos las puertas del nivel
            foreach (BPuerta puerta in GetComponentsInChildren <BPuerta>())
            {
                puerta.SetupDoor(manager);
            }

            foreach (BTerminal terminal in GetComponentsInChildren <BTerminal>())
            {
                terminal.SetupTerminal(manager);
            }

            foreach (BBaliza baliza in GetComponentsInChildren <BBaliza>())
            {
                baliza.SetupBaliza(manager);
            }
        }
        else
        {
            // Obtenemos todos los enemigos y los desactivamos
            foreach (BEnemy enemy in GetComponentsInChildren <BEnemy>())
            {
                enemy.EndEnemy();
            }
        }

        // Spawneamos el target de la camara y lo colocamos en el centro
        GameObject target = new GameObject("Camera Target");

        target.transform.position = Vector3.zero;
        target.transform.rotation = Quaternion.identity;

        target.transform.parent = this.transform;

        // Instanciamos la camara
        GameObject cameraGO = Instantiate(boardInfo.camera, cameraInfo.position, Quaternion.Euler(cameraInfo.rotation));

        cameraGO.transform.parent = target.transform;

        // Guardamos el script de la camara
        camera = cameraGO.GetComponent <BCameraController>();

        // Ejecutamos el Setup
        camera.SetupCamera(manager, cameraInfo);
    }