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