// A partir de este punto se representa un agente basado en modelos.
    // La idea es similar a crear una máquina de estados finita donde se hacen las siguientes consideraciones:
    // - El alfabeto es un conjunto predefinido de percepciones hechas con sensores del agente
    // - El conjunto de estados representa un conjunto de métodos con acciones del agente
    // - La función de transición es un método
    // - El estado inicial se inicializa en Start()
    // - El estado final es opcional
    Estado TablaDeTransicion(Estado estado, Percepcion percepcion)
    {
        switch (estado)
        {
        case Estado.Avanzar:
            switch (percepcion)
            {
            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA PARED
            case Percepcion.CercaDePared:
                estado = Estado.Detenerse;
                break;

            case Percepcion.NoCercaDePared:
                estado = Estado.Avanzar;
                break;

            case Percepcion.FrenteAPared:
                estado = Estado.Detenerse;
                break;

            case Percepcion.NoFrenteAPared:
                estado = Estado.Avanzar;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DEL OBJETO
            case Percepcion.CercaDeObjeto:
                estado = Estado.Detenerse;
                break;

            case Percepcion.NoCercaDeObjeto:
                estado = Estado.Avanzar;
                break;

            case Percepcion.FrenteAObjeto:
                estado = Estado.Detenerse;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA BATERIA
            case Percepcion.BateriaBaja:
                estado = Estado.Retornar;
                break;

            case Percepcion.TocandoBase:
                estado = Estado.Cargarse;
                break;
            }
            break;

        case Estado.Detenerse:
            switch (percepcion)
            {
            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA PARED
            case Percepcion.CercaDePared:
                estado = Estado.Retroceder;
                break;

            case Percepcion.NoCercaDePared:
                estado = Estado.Avanzar;
                break;

            case Percepcion.FrenteAPared:
                estado = Estado.Girar;
                break;

            case Percepcion.NoFrenteAPared:
                estado = Estado.Avanzar;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DEL OBJETO
            case Percepcion.CercaDeObjeto:
                estado = Estado.Girar;
                break;

            case Percepcion.NoCercaDeObjeto:
                estado = sensor.CercaDePared() == false ? Estado.Avanzar : Estado.Retroceder;
                break;

            case Percepcion.FrenteAObjeto:
                estado = Estado.Detenerse;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA BATERIA
            case Percepcion.BateriaBaja:
                estado = Estado.Retornar;
                break;

            case Percepcion.TocandoBase:
                estado = sensor.Bateria() > 50 ? Estado.Ascender : Estado.Cargarse;
                break;
            }
            break;

        case Estado.Girar:
            switch (percepcion)
            {
            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA PARED
            case Percepcion.CercaDePared:
                estado = Estado.Retroceder;                                 //Antes avanzaba
                break;

            case Percepcion.NoCercaDePared:
                estado = Estado.Avanzar;
                break;

            case Percepcion.FrenteAPared:
                estado = Estado.Girar;
                break;

            case Percepcion.NoFrenteAPared:
                estado = Estado.Avanzar;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DEL OBJETO
            case Percepcion.CercaDeObjeto:
                estado = Estado.Detenerse;
                break;

            case Percepcion.NoCercaDeObjeto:
                estado = Estado.Avanzar;
                break;

            case Percepcion.FrenteAObjeto:
                estado = Estado.Detenerse;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA BATERIA
            case Percepcion.BateriaBaja:
                estado = Estado.Retornar;
                break;

            case Percepcion.TocandoBase:
                estado = sensor.Bateria() > 50 ? Estado.Avanzar : Estado.Cargarse;
                break;
            }
            break;

        case Estado.Retroceder:
            switch (percepcion)
            {
            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA PARED
            case Percepcion.CercaDePared:
                estado = Estado.Retroceder;
                break;

            case Percepcion.NoCercaDePared:
                //estado = sensor.FrenteAPared() == false ? Estado.Avanzar : Estado.Girar;
                //Debug.Log("Estoy aqui");
                estado = Estado.Avanzar;
                break;

            case Percepcion.FrenteAPared:
                estado = Estado.Detenerse;
                break;

            case Percepcion.NoFrenteAPared:
                estado = Estado.Avanzar;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DEL OBJETO
            case Percepcion.CercaDeObjeto:
                estado = Estado.Detenerse;
                break;

            case Percepcion.NoCercaDeObjeto:
                estado = sensor.CercaDePared() == false ? Estado.Avanzar : Estado.Retroceder;
                break;

            case Percepcion.FrenteAObjeto:
                estado = Estado.Detenerse;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA BATERIA
            case Percepcion.BateriaBaja:
                estado = Estado.Retornar;
                break;

            case Percepcion.TocandoBase:
                estado = sensor.Bateria() > 50 ? Estado.Avanzar : Estado.Cargarse;
                break;
            }
            break;

        case Estado.Retornar:
            switch (percepcion)
            {
            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA PARED
            case Percepcion.CercaDePared:
                estado = Estado.Retornar;
                break;

            case Percepcion.NoCercaDePared:
                estado = Estado.Retornar;
                break;

            case Percepcion.FrenteAPared:
                estado = Estado.Retornar;
                break;

            case Percepcion.NoFrenteAPared:
                estado = Estado.Retornar;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DEL OBJETO
            case Percepcion.CercaDeObjeto:
                estado = Estado.Retornar;
                break;

            case Percepcion.NoCercaDeObjeto:
                estado = Estado.Retornar;
                break;

            case Percepcion.FrenteAObjeto:
                estado = Estado.Retornar;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA BATERIA
            case Percepcion.BateriaBaja:
                estado = Estado.Retornar;
                break;

            case Percepcion.TocandoBase:
                estado = sensor.Bateria() > 50 ? Estado.Avanzar : Estado.Cargarse;
                break;
            }
            break;

        case Estado.Cargarse:
            switch (percepcion)
            {
            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA PARED
            case Percepcion.CercaDePared:
                estado = Estado.Retornar;
                break;

            case Percepcion.NoCercaDePared:
                estado = Estado.Retornar;
                break;

            case Percepcion.FrenteAPared:
                estado = Estado.Retornar;
                break;

            case Percepcion.NoFrenteAPared:
                estado = Estado.Retornar;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DEL OBJETO
            case Percepcion.CercaDeObjeto:
                estado = Estado.Retornar;
                break;

            case Percepcion.NoCercaDeObjeto:
                estado = Estado.Retornar;
                break;

            case Percepcion.FrenteAObjeto:
                estado = Estado.Retornar;
                break;

            // COMPORTAMIENTO CON BASE A LAS PERCEPCIONES DE LA BATERIA
            case Percepcion.BateriaBaja:
                estado = Estado.Retornar;
                break;

            case Percepcion.TocandoBase:
                estado = Estado.Cargarse;
                estado = sensor.Bateria() < sensor.BateriaMaxima() ? Estado.Cargarse : Estado.Ascender;
                break;
            }
            break;

        case Estado.Ascender:
            estado = transform.position.y >= 1.83 ? Estado.Detenerse : Estado.Ascender;
            break;
        }

        return(estado);
    }