public void Setup(Grilla <CasillaNodo> grid) { visualNodeArray = new Transform[grid.GetWidth(), grid.GetHeight()]; for (int x = 0; x < grid.GetWidth(); x++) { for (int y = 0; y < grid.GetHeight(); y++) { Vector3 gridPosition = new Vector3(x, y) * grid.GetCellSize() + Vector3.one * grid.GetCellSize() * .5f; Transform visualNode = CreateVisualNode(gridPosition); visualNodeArray[x, y] = visualNode; visualNodeList.Add(visualNode); } } HideNodeVisuals(); }
public List <CasillaNodo> EncontrarVecindad(CasillaNodo nodoactual) //retorna la vecindad de la casilla nodoactual { List <CasillaNodo> ListaDeVecinos = new List <CasillaNodo>(); // Arriba if (nodoactual.y + 1 < grilla.GetHeight()) { ListaDeVecinos.Add(GetNodo(nodoactual.x, nodoactual.y + 1)); // si no se sale abajo añada el nodo de abajo a ListaDeVecinos } //Derecha if (nodoactual.x + 1 < grilla.GetWidth()) { ListaDeVecinos.Add(GetNodo(nodoactual.x + 1, nodoactual.y)); // si no se sale a la derecha añada el nodo de la derecha a ListaDeVecinos } // Abajo if (nodoactual.y - 1 >= 0) { ListaDeVecinos.Add(GetNodo(nodoactual.x, nodoactual.y - 1)); // si no se sale a la arriba añada el nodo de arriba a ListaDeVecinos } //Izquierda if (nodoactual.x - 1 >= 0) { ListaDeVecinos.Add(GetNodo(nodoactual.x - 1, nodoactual.y)); // si no se sale a la izquierda añada el nodo de la izquierda a ListaDeVecinos } return(ListaDeVecinos); }
public void TakeSnapshot(Grilla <Nodo> grid, Nodo current, List <Nodo> openList, List <Nodo> closedList) { GridSnapshotAction gridSnapshotAction = new GridSnapshotAction(); gridSnapshotAction.AddAction(HideNodeVisuals); for (int x = 0; x < grid.GetWidth(); x++) { for (int y = 0; y < grid.GetHeight(); y++) { Nodo Nodo = grid.GetGridObject(x, y); int CostoG = Nodo.CostoG; int CostoH = Nodo.CostoH; int CostoF = Nodo.CostoF; Vector3 gridPosition = new Vector3(Nodo.x, Nodo.y) * grid.GetCellSize() + Vector3.one * grid.GetCellSize() * .5f; bool isCurrent = Nodo == current; bool isInOpenList = openList.Contains(Nodo); bool isInClosedList = closedList.Contains(Nodo); int tmpX = x; int tmpY = y; gridSnapshotAction.AddAction(() => { Transform visualNode = visualNodeArray[tmpX, tmpY]; SetupVisualNode(visualNode, CostoG, CostoH, CostoF); Color backgroundColor = UtilsClass.GetColorFromString("636363"); if (isInClosedList) { backgroundColor = new Color(1, 0, 0); } if (isInOpenList) { backgroundColor = UtilsClass.GetColorFromString("009AFF"); } if (isCurrent) { backgroundColor = new Color(0, 1, 0); } visualNode.Find("sprite").GetComponent <SpriteRenderer>().color = backgroundColor; }); } } gridSnapshotActionList.Add(gridSnapshotAction); }
public void TakeSnapshotFinalPath(Grilla <CasillaNodo> grid, List <CasillaNodo> path) { GridSnapshotAction gridSnapshotAction = new GridSnapshotAction(); gridSnapshotAction.AddAction(HideNodeVisuals); for (int x = 0; x < grid.GetWidth(); x++) { for (int y = 0; y < grid.GetHeight(); y++) { CasillaNodo CasillaNodo = grid.GetGridObject(x, y); Vector3 gridPosition = new Vector3(CasillaNodo.x, CasillaNodo.y) * grid.GetCellSize() + Vector3.one * grid.GetCellSize() * .5f; bool isInPath = path.Contains(CasillaNodo); int tmpX = x; int tmpY = y; gridSnapshotAction.AddAction(() => { Transform visualNode = visualNodeArray[tmpX, tmpY]; Color backgroundColor; if (isInPath) { backgroundColor = new Color(0, 1, 0); } else { backgroundColor = UtilsClass.GetColorFromString("636363"); } visualNode.Find("sprite").GetComponent <SpriteRenderer>().color = backgroundColor; }); } } gridSnapshotActionList.Add(gridSnapshotAction); }
private void UpdateVisual() { MeshUtils.CreateEmptyMeshArrays(grid.GetWidth() * grid.GetHeight(), out Vector3[] vertices, out Vector2[] uv, out int[] triangles);
public List <Nodo> EncontrarCamino(int startX, int startY, int endX, int endY, int type) { Nodo StartNode = grilla.GetGridObject(startX, startY); Nodo endNode = grilla.GetGridObject(endX, endY); CaminosPosibles = new List <Nodo> { StartNode }; CaminosVisitados = new List <Nodo>(); for (int x = 0; x < grilla.GetWidth(); x++) { for (int y = 0; y < grilla.GetHeight(); y++) { Nodo nodo = grilla.GetGridObject(x, y); nodo.CostoG = int.MaxValue; nodo.CalcularCostoF(); nodo.Padre = null; } } StartNode.CostoG = 0; StartNode.CostoH = CalcularDistanciaEntre(StartNode, endNode); StartNode.CalcularCostoF(); PathfindingDebugStepVisual.Instance.ClearSnapshots(); PathfindingDebugStepVisual.Instance.TakeSnapshot(grilla, StartNode, CaminosPosibles, CaminosVisitados); while (CaminosPosibles.Count > 0) { Nodo NodoActual = EncontrarValorMenor(CaminosPosibles, type); if (NodoActual == endNode) { PathfindingDebugStepVisual.Instance.TakeSnapshot(grilla, StartNode, CaminosPosibles, CaminosVisitados); PathfindingDebugStepVisual.Instance.TakeSnapshotFinalPath(grilla, CaminoCalculado(endNode)); return(CaminoCalculado(endNode)); } CaminosPosibles.Remove(NodoActual); CaminosVisitados.Add(NodoActual); foreach (Nodo nodoVecino in ValorarVecindad(NodoActual)) { if (CaminosVisitados.Contains(nodoVecino)) { continue; } if (!nodoVecino.casillaValida) { CaminosVisitados.Add(nodoVecino); continue; } int CostoGIdeal = NodoActual.CostoG + CalcularDistanciaEntre(NodoActual, nodoVecino); if (CostoGIdeal < nodoVecino.CostoG) { nodoVecino.Padre = NodoActual; nodoVecino.CostoG = CostoGIdeal; nodoVecino.CostoH = CalcularDistanciaEntre(nodoVecino, endNode); nodoVecino.CalcularCostoF(); if (!CaminosPosibles.Contains(nodoVecino)) { CaminosPosibles.Add(nodoVecino); } } PathfindingDebugStepVisual.Instance.TakeSnapshot(grilla, StartNode, CaminosPosibles, CaminosVisitados); } } //una vez se acaben los caminos posibles y no hay solucion return(null); }