Path traceBack(Vector3 a, Vector3 b, pNode node) { List <Vector3> p = new List <Vector3>(); p.Add(b); while (node.prev != null) { p.Add(surface.Graph[node.index].Position); node = node.prev; } p.Reverse(); return(new Path(p.ToArray())); }
void CreateGrid() { for (int i = 0; i < nodeRows; i++) { for (int j = 0; j < nodeCols; j++) { int offSet = 0; if (j % 2 != 0) { //offSet = 1; } nodes[i, j] = new pNode(); nodes[i, j].connections = new bool[8]; nodes[i, j].obj = Instantiate(nodePublic, new Vector3(2 * i + offSet - 12, 1 * j - 7, 1), Quaternion.identity); nodes[i, j].X = i; nodes[i, j].Y = j; //nodes[i, j].connectedNodes = new pNode[8]; nodes[i, j].removed = false; } } for (int i = 1; i < nodeRows - 1; i++) { for (int j = 1; j < nodeCols - 1; j++) { //nodes[i, j].connectedNodes[0] = nodes[i, j + 1]; //nodes[i, j].connectedNodes[1] = nodes[i + 1, j + 1]; //nodes[i, j].connectedNodes[2] = nodes[i + 1, j]; //nodes[i, j].connectedNodes[3] = nodes[i + 1, j - 1]; //nodes[i, j].connectedNodes[4] = nodes[i, j - 1]; //nodes[i, j].connectedNodes[5] = nodes[i - 1, j - 1]; //nodes[i, j].connectedNodes[6] = nodes[i - 1, j]; //nodes[i, j].connectedNodes[7] = nodes[i - 1, j + 1]; } } }
public pNode(pNode prev, int index) { this.prev = prev; this.index = index; }
List <Vector3> CalculatePath(Vector3 playerPos, Vector3 targetPos) { List <pNode> openList = new List <pNode>(); List <pNode> closedList = new List <pNode>(); int g = 0; pNode startNode; bool startFound = false; bool targetFound = false; int nodesDone = 0; for (int i = 0; i < nodeRows; i++) { for (int j = 0; j < nodeCols; j++) { //Debug.Log((nodes[i, j].obj.transform.position - playerPos).magnitude); if ((nodes[i, j].obj.transform.position - playerPos).magnitude < minDist && !startFound) { Debug.Log("Found start node"); startFound = true; startNode = nodes[i, j]; openList.Add(nodes[i, j]); nodesDone++; } if ((nodes[i, j].obj.transform.position - targetPos).magnitude < minDist && !targetFound) { Debug.Log("Found target node"); targetFound = true; targetNode = nodes[i, j]; //openList.Add(nodes[i, j]); nodesDone++; } if (nodesDone >= 2) { i = nodeRows; break; } } } while (openList.Count > 0) { int lowF = 50000; // random large number pNode current = new pNode(); //node with lowest F foreach (pNode n in openList) { if (n.F < lowF) { lowF = n.F; current = n; } closedList.Add(current); openList.Remove(current); List <pNode> adj = GetWalkableNodes(current.X, current.Y); g++; for (int i = 0; i < adj.Count; i++) { if (closedList.Contains(adj[i])) { continue; } else if (!openList.Contains(adj[i])) { adj[i].G = g; adj[i].H = CalculateHScore(adj[i].X, adj[i].Y, targetNode.X, targetNode.Y); adj[i].F = adj[i].G + adj[i].H; adj[i].parent = current; } else { // test if using the current G score makes the adjacent square's F score // lower, if yes update the parent because it means it's a better path if (g + adj[i].H < adj[i].F) { adj[i].G = g; adj[i].H = CalculateHScore(adj[i].X, adj[i].Y, targetNode.X, targetNode.Y); adj[i].F = adj[i].G + adj[i].H; adj[i].parent = current; } } } if (closedList[closedList.Count - 1].obj == targetNode.obj) { List <Vector3> pathlist = new List <Vector3>(); foreach (pNode p in openList) { pathlist.Add(p.obj.transform.position); } return(pathlist); } } } Debug.Log("Dont show this message"); return(null); }