// 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); }