示例#1
0
    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;
 }