public List <Nodo> ResolverCamino(Vector3 posInicial, Vector3 posObjetivo) { Nodo nodoInicial = grid.NodoDeUnPunto(posInicial); Nodo nodoObjetivo = grid.NodoDeUnPunto(posObjetivo); List <Nodo> setAbiertos = new List <Nodo>(); HashSet <Nodo> setCerrados = new HashSet <Nodo>(); setAbiertos.Add(nodoInicial); while (setAbiertos.Count > 0) { Nodo nodoActual = setAbiertos[0]; for (int i = 1; i < setAbiertos.Count; i++) { if (setAbiertos[i].costoF < nodoActual.costoF || setAbiertos[i].costoF == nodoActual.costoF && setAbiertos[i].costoH < nodoActual.costoH) //siguiente posicion { nodoActual = setAbiertos[i]; } } setAbiertos.Remove(nodoActual); setCerrados.Add(nodoActual); if (nodoActual == nodoObjetivo) { rutaActual = trazarRuta(nodoInicial, nodoObjetivo); return(rutaActual); //camino encontrado } //En las siguientes lineas se asigna el set abiertos, los posibles nodos que pueden ocupar el camino foreach (Nodo vecino in grid.getNodosVecinos(nodoActual)) { if (!vecino.walkable || setCerrados.Contains(vecino)) { continue; } int costoNuevoMovimientoAlVecino = nodoActual.costoG + getDistancia(nodoActual, vecino); if (costoNuevoMovimientoAlVecino < vecino.costoG || !setAbiertos.Contains(vecino)) { vecino.costoG = costoNuevoMovimientoAlVecino; vecino.costoH = getDistancia(vecino, nodoObjetivo); vecino.nodoPadre = nodoActual; if (!setAbiertos.Contains(vecino)) { setAbiertos.Add(vecino); } } } } return(rutaActual); }
void Update() { transform.position = guia.NodoDeUnPunto(transform.position).worldPosition; }