Advertisement
SebastianLague

A* find closest walkable node

Nov 20th, 2016
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.70 KB | None | 0 0
  1. public Node ClosestWalkableNode(Node node) {
  2.         int maxRadius = Mathf.Max (gridSizeX, gridSizeY) / 2;
  3.         for (int i = 1; i < maxRadius; i++) {
  4.             Node n = FindWalkableInRadius (node.gridX, node.gridY, i);
  5.             if (n != null) {
  6.                 return n;
  7.  
  8.             }
  9.         }
  10.         return null;
  11.     }
  12.     Node FindWalkableInRadius(int centreX, int centreY, int radius) {
  13.        
  14.         for (int i = -radius; i <= radius; i ++) {
  15.             int verticalSearchX = i + centreX;
  16.             int horizontalSearchY = i + centreY;
  17.  
  18.             // top
  19.             if (InBounds(verticalSearchX, centreY + radius)) {
  20.                 Debug.DrawRay (grid [verticalSearchX, centreY + radius].worldPosition, Vector3.up * 2,Color.green,radius);
  21.                 if (grid[verticalSearchX, centreY + radius].walkable) {
  22.                     return grid [verticalSearchX, centreY + radius];
  23.                 }
  24.             }
  25.  
  26.             // bottom
  27.             if (InBounds(verticalSearchX, centreY - radius)) {
  28.                 if (grid[verticalSearchX, centreY - radius].walkable) {
  29.                     return grid [verticalSearchX, centreY - radius];
  30.                 }
  31.             }
  32.             // right
  33.             if (InBounds(centreY + radius, horizontalSearchY)) {
  34.                 Debug.DrawRay (grid [centreY + radius, horizontalSearchY].worldPosition, Vector3.up * 2,Color.red,radius);
  35.                 if (grid[centreX + radius, horizontalSearchY].walkable) {
  36.                     return grid [centreX + radius, horizontalSearchY];
  37.                 }
  38.             }
  39.  
  40.             // left
  41.             if (InBounds(centreY - radius, horizontalSearchY)) {
  42.                 Debug.DrawRay (grid [centreY - radius, horizontalSearchY].worldPosition, Vector3.up * 2,Color.red,radius);
  43.                 if (grid[centreX - radius, horizontalSearchY].walkable) {
  44.                     return grid [centreX - radius, horizontalSearchY];
  45.                 }
  46.             }
  47.  
  48.         }
  49.  
  50.         return null;
  51.  
  52.     }
  53.  
  54.     bool InBounds(int x, int y) {
  55.         return x>=0 && x<gridSizeX && y>= 0 && y<gridSizeY;
  56.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement