Example #1
0
    // Se utiliza Fixed Update para mas precision en los calculos y uso de fisicas
    void FixedUpdate()
    {
        if (Mathf.RoundToInt(transform.position.x) == 1 && Mathf.RoundToInt(transform.position.z) == 1) // Si pasa por la base se recarga instantaneamente
        {
            bateriaBaja = false;
            bateria     = 100;
        }


        // Estado de busqueda libre, va avanzando por espacios no visitados
        if (_estado == 1)
        {
            // Calcula la posicion siguiente en indices para la matriz
            _xPosicionAdelante = Mathf.RoundToInt(transform.position.x + Mathf.RoundToInt(transform.forward.x) * normalizacionDePosicion);
            _zPosicionAdelante = Mathf.RoundToInt(transform.position.z + Mathf.RoundToInt(transform.forward.z) * normalizacionDePosicion);

            // Si la siguiente posicion esta vacia o es desconocida, siguen adelante, solo entra cuando se esta en angulo modulo 90
            if (_mapa[_xPosicionAdelante][_zPosicionAdelante] <= 0 && _mapa[_xPosicionAdelante][_zPosicionAdelante] != -2 && (Mathf.Abs(transform.eulerAngles.y) % 90.0f < 5 || Mathf.Abs(transform.eulerAngles.y) % 90.0f > 85.0f))
            {
                int auxax = Mathf.RoundToInt(transform.position.x);
                int auxaz = Mathf.RoundToInt(transform.position.z);

                // Ya se avanzo de posicion en la matriz
                if (ax != auxax || az != auxaz)
                {
                    if (bateriaBaja)
                    {
                        BuscarBase();              // Bateria baja, tiene que ir a recargar
                    }
                    _sensores.VerLados();

                    Instantiate(marcaVisitado, new Vector3(auxax, 5, auxaz), Quaternion.identity);
                    _mapa[ax][az] = _marcadorVisitados;
                    ax            = auxax;
                    az            = auxaz;
                }

                _actuadores.Avanzar(velocidadMovimiento);

                if (!_hayCamino) // Si es el primer frame en el que encontro camino, se alinea, osea arregla su angulo y posicion
                {
                    _actuadores.Alinear();
                    _hayCamino = true;
                }
            }
            else // Si no hay camino al frente, rota
            {
                _hayCamino = false;
                _actuadores.RotarIzquierda(velocidadRotacion);
            }
        }
        // Estado de busqueda direccionada
        else if (_estado == 2)
        {
            if (_xObjetivo == -1 && _zObjetivo == -1) // si no se encontro camino, entonces se dirige a la base
            {
                BuscarBase();
            }

            // Calcula la posicion siguiente, la posicion a la derecha y la posicion a la izquierda en indices para la matriz
            _xPosicionAdelante  = Mathf.RoundToInt(transform.position.x + Mathf.RoundToInt(transform.forward.x) * normalizacionDePosicion);
            _zPosicionAdelante  = Mathf.RoundToInt(transform.position.z + Mathf.RoundToInt(transform.forward.z) * normalizacionDePosicion);
            _xPosicionDerecha   = Mathf.RoundToInt(transform.position.x + Mathf.RoundToInt(transform.right.x) * normalizacionDePosicion);
            _zPosicionDerecha   = Mathf.RoundToInt(transform.position.z + Mathf.RoundToInt(transform.right.z) * normalizacionDePosicion);
            _xPosicionIzquierda = Mathf.RoundToInt(transform.position.x - Mathf.RoundToInt(transform.right.x) * normalizacionDePosicion);
            _zPosicionIzquierda = Mathf.RoundToInt(transform.position.z - Mathf.RoundToInt(transform.right.z) * normalizacionDePosicion);

            // Si la posicion al frente es la siguiente en el mapa de pathfinding, sigue adelante
            if ((_pathfinding[_xPosicionAdelante][_zPosicionAdelante] <= _pathfinding[Mathf.RoundToInt(transform.position.x)][Mathf.RoundToInt(transform.position.z)] && _pathfinding[_xPosicionAdelante][_zPosicionAdelante] >= 1) && (Mathf.Abs(transform.eulerAngles.y) % 90.0f < 5.0f || Mathf.Abs(transform.eulerAngles.y) % 90.0f > 85.0f))
            {
                _sensores.VerLados();

                int auxax = Mathf.RoundToInt(transform.position.x - Mathf.RoundToInt(transform.forward.x) * 0.4f);
                int auxaz = Mathf.RoundToInt(transform.position.z - Mathf.RoundToInt(transform.forward.z) * 0.4f);

                // Si ya se llego al objetivo, pasa al Estado de busqueda libre
                if (Mathf.RoundToInt(transform.position.x) == _xObjetivo && Mathf.RoundToInt(transform.position.z) == _zObjetivo)
                {
                    _mapa[Mathf.RoundToInt(transform.position.x)][Mathf.RoundToInt(transform.position.z)] = 1;
                    _estado = 1;
                }

                // Cambie de lugar en la matriz
                if (ax != auxax || az != auxaz)
                {
                    ax = auxax;
                    az = auxaz;

                    // Si no me dirijo a la base y veo espacios a mis lados, paso a modo de busqueda libre directamente
                    if ((_mapa[_xPosicionDerecha][_zPosicionDerecha] == 0 || _mapa[_xPosicionIzquierda][_zPosicionIzquierda] == 0 || _mapa[_xPosicionAdelante][_zPosicionAdelante] == 0) && _xObjetivo != 1 && _zObjetivo != 1)
                    {
                        transform.position = new Vector3(ax, transform.position.y, az);
                        _estado            = 1;
                        _xPosicionAdelante = -1;
                        _zPosicionAdelante = -1;
                    }
                }


                _actuadores.Avanzar(velocidadMovimiento);

                if (!_hayCamino)
                {
                    _actuadores.Alinear();
                    _hayCamino = true;
                }
            }
            else // Si no tengo camino al frente, roto
            {
                _hayCamino = false;
                _actuadores.RotarIzquierda(velocidadRotacion);
            }
        }
    }