// Update is called once per frame void Update() { if (!sensor.CercaDePared()) { actuador.MoverAdelante(); } if (sensor.CercaDeBasura()) { //Vector posBasura = sensor.GetPosicionBasura(); actuador.GirarDerecha(); if (sensor.FrenteBasura()) { actuador.MoverAdelante(); if (sensor.TocandoBasura()) { actuador.Aspirar(sensor.GetBasura()); } } } else { actuador.MoverAdelante(); } }
void evitaMuros() { sensorPared = sensor.CercaDePared(); disponibles = new List <int>() { 0, 1, 2, 3, 4, 5 }; foreach (int sID in sensorPared) { if (!bloqueados.Contains(sID)) { bloqueados.Add(sID); } disponibles.Remove(sID); } }
void FixedUpdate() { if (sensor.Bateria() <= 0) { return; } if (sensor.CercaDePared()) { actuador.Flotar(); actuador.Detener(); } else { actuador.Flotar(); actuador.Adelante(); } }
// 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); }
// Update y FixedUpdate son similares en uso, pero por regla general se recomienda usar // FixedUpdate para calcular elementos físicos como el uso de Rigidbody void FixedUpdate() { // El agente no realiza ninguna acción si no tiene batería if (sensor.Bateria() <= 0) { return; } // A continuación se muestran ejemplos de uso de actuadores y sensores // para ser utilizados de manera manual (por una persona): if (Input.GetKey(KeyCode.I)) { actuador.Ascender(); } if (Input.GetKey(KeyCode.K)) { actuador.Descender(); } if (!Input.GetKey(KeyCode.I) && !Input.GetKey(KeyCode.K)) { actuador.Flotar(); } if (Input.GetAxis("Vertical") > 0) { actuador.Adelante(); } if (Input.GetAxis("Vertical") < 0) { actuador.Atras(); } if (Input.GetKey(KeyCode.J)) { actuador.GirarIzquierda(); } if (Input.GetKey(KeyCode.L)) { actuador.GirarDerecha(); } if (Input.GetAxis("Horizontal") > 0) { actuador.Derecha(); } if (Input.GetAxis("Horizontal") < 0) { actuador.Izquierda(); } if (sensor.TocandoBasura()) { Debug.Log("Tocando basura!"); actuador.Limpiar(sensor.GetBasura()); } if (sensor.TocandoPared()) { Debug.Log("Tocando pared!"); } if (sensor.CercaDeBasura()) { Debug.Log("Cerca de una basura!"); } if (sensor.CercaDePared()) { Debug.Log("Cerca de una pared!"); } if (sensor.FrenteAPared()) { Debug.Log("Frente a pared!"); } if (Input.GetKey(KeyCode.F)) { actuador.Detener(); } if (Input.GetKey(KeyCode.G)) { Debug.Log(sensor.Ubicacion()); } }
// En cada frame decidimos el comportamiento del agente. // Para este caso, tenemos un control "manual" del agente, es decir, un usuario puede controlarlo mediante // un control/gamepad o flechas del teclado y imprime información en consola. void Update() { if (bateria < 50.0f && !sensor.TocandoEstacion()) { actuador.Regresar(actuador.StackX(), 0.25f, actuador.StackZ()); } else if (!sensor.TocandoEstacion()) { actuador.CaminoRegreso(actuador.GetX(), actuador.GetY(), actuador.GetZ()); } if (sensor.TocandoEstacion() && bateria < maxBateria) { bateria += Time.deltaTime * factorRecarga; } else { if (sensor.FrentePared()) { if (bandera == true) { actuador.GirarIzquierda(); } else { actuador.GirarDerecha(); //bandera = !bandera; } } if (sensor.TocandoPared()) { actuador.Detener(); actuador.MoverAtras(); if (bandera == true) { actuador.GirarIzquierda(); } else { actuador.GirarDerecha(); //bandera = !bandera; } } if (!sensor.CercaDeBasura()) { actuador.MoverAdelante(); } else { if (!sensor.FrenteBasura()) { if (bandera == true) { actuador.GirarIzquierda(); } else { actuador.GirarDerecha(); //bandera = !bandera; } } else { actuador.MoverAdelante(); } if (sensor.TocandoBasura()) { actuador.Aspirar(sensor.getBasura()); sensor.setTouchBasura(false); sensor.setCercaBasura(false); } } } // La batería se consume lentamente. En caso de que se termine, no realiza ninguna acción if (bateria <= 0) { return; } else { bateria -= Time.deltaTime; } // Recargar batería al contacto, sin rebasar límite de carga if (sensor.TocandoEstacion() && bateria < maxBateria) { bateria += Time.deltaTime * factorRecarga; } /* * // Ejemplo de control no-automatico. Requiere de la intervención de una persona * // Se realiza con fines demostrativos y de prueba de actuadores y sensores * if(Input.GetKeyDown(KeyCode.UpArrow) || Input.GetAxis("Vertical") == 1) * actuador.MoverAdelante(); * if(Input.GetKeyDown(KeyCode.DownArrow) || Input.GetAxis("Vertical") == -1) * actuador.MoverAtras(); * if(Input.GetKeyDown(KeyCode.RightArrow) || Input.GetAxis("Horizontal") == 1) * actuador.GirarDerecha(); * if(Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetAxis("Horizontal") == -1) * actuador.GirarIzquierda(); */ // Imprime informacion en la consola (Debug) para verificar algunos eventos if (sensor.TocandoPared()) { Debug.Log("Tocando pared"); } if (sensor.TocandoBasura()) { Debug.Log("Tocando basura"); } if (sensor.CercaDeBasura()) { Debug.Log("Cerca de basura"); } if (sensor.CercaDePared()) { Debug.Log("Cerca de pared"); } if (sensor.FrenteBasura()) { Debug.Log("Frente a basura"); } if (sensor.FrentePared()) { Debug.Log("Frente a pared"); } }