private void Update() { if (Input.GetMouseButtonDown(0)) { var ray = hitCamera.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (baseCollider.Raycast(ray, out hit, 20)) { NavigationBuildPoint point = points[graph.FindNearestId(hit.point)]; startObject.position = hit.point; startPoint = point; TryFindPath(); } } if (Input.GetMouseButtonDown(1)) { var ray = hitCamera.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (baseCollider.Raycast(ray, out hit, 20)) { NavigationBuildPoint point = points[graph.FindNearestId(hit.point)]; endObject.position = hit.point; endPoint = point; TryFindPath(); } } }
private void MergePoints(NavigationBuildPoint point, NavigationBuildPoint merge) { foreach (var neigbhor in merge.Neigbhors) { if (neigbhor.Neigbhors == null) { continue; } for (int i = 0; i < neigbhor.Neigbhors.Count; i++) { if (neigbhor.Neigbhors[i] == merge) { neigbhor.Neigbhors[i] = point; } } } point.Neigbhors.AddRange(merge.Neigbhors); merge.Neigbhors = null; }
private NavigationBuildPoint[] GenerateNavGrid(float radius) { var directions = new Quaternion[] { Quaternion.Euler(0, 0, 0), Quaternion.Euler(0, 90, 0), Quaternion.Euler(0, 180, 0), Quaternion.Euler(0, 270, 0), Quaternion.Euler(90, 0, 0), Quaternion.Euler(-90, 0, 0), }; List <NavigationBuildPoint> points = new List <NavigationBuildPoint>(); List <NavigationBuildPoint> borderPoins = new List <NavigationBuildPoint>(); NavigationBuildPoint[] grid = new NavigationBuildPoint[size * size]; for (int d = 0; d < directions.Length; d++) { var direction = directions[d]; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { Vector3 cellPosition = direction * new Vector3(-0.5f + 1f * (i / (float)(size - 1)), -0.5f + 1f * (j / (float)(size - 1)), 0.5f); Vector3 normal = cellPosition.normalized; Vector3 cell = (cellPosition + Vector3.one) * size; bool isBorderPoint = (i == 0 || j == 0 || i == size - 1 || j == size - 1); var point = new NavigationBuildPoint() { Position = normal * radius, UpNormal = normal, IsBorderPoint = isBorderPoint, PositionHash = (int)(cell.x * (size + 1)) * (size + 1) + (int)(cell.y * (size + 1)) + (int)cell.z }; if (isBorderPoint) { borderPoins.Add(point); } points.Add(point); grid[i * size + j] = point; } } // add links for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { for (int dx = -2; dx <= 2; dx++) { for (int dy = -2; dy <= 2; dy++) { if (dx == 0 && dy == 0) { } else { AddLinks(ref grid, ref grid[i * size + j].Neigbhors, i + dx, j + dy); } } } } } } // merge borders foreach (var point in borderPoins) { if (point.Neigbhors == null) { continue; } foreach (var merge in borderPoins) { if (merge == point) { continue; } if (merge.Neigbhors == null) { continue; } if (merge.PositionHash == point.PositionHash) { MergePoints(point, merge); break; } } } points.RemoveAll(point => point.Neigbhors == null); foreach (var point in points) { point.Distances = new List <float>(point.Neigbhors.Count); for (int i = 0; i < point.Neigbhors.Count; i++) { var distance = Vector3.Distance(point.Position, point.Neigbhors[i].Position); point.Distances.Add(distance); } } return(points.ToArray()); }
private List <NavigationBuildPoint> GenerateNavGridIcosaedron(float radius) { List <NavigationBuildPoint> points = new List <NavigationBuildPoint>(); List <NavigationBuildPoint> borderPoins = new List <NavigationBuildPoint>(); NavigationBuildPoint[] grid = new NavigationBuildPoint[size * size]; for (int d = 0; d < icosaedronFaces.Length / 3; d++) { var A = icosaedronVertices[icosaedronFaces[d * 3 + 0]]; var B = icosaedronVertices[icosaedronFaces[d * 3 + 1]]; var C = icosaedronVertices[icosaedronFaces[d * 3 + 2]]; var BA = B - A; var CA = C - A; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { if (i + j >= size) { continue; } Vector3 cellPosition = A + BA * (i / (float)(size - 1)) + CA * (j / (float)(size - 1)); Vector3 normal = cellPosition.normalized; Vector3 cell = (normal + Vector3.one) * size * 10f; bool isBorderPoint = (i == 0 || j == 0 || i + j == size - 1); var point = new NavigationBuildPoint() { Position = normal * radius, UpNormal = normal, IsBorderPoint = isBorderPoint, PositionHash = (int)(cell.x * (size + 1f) * (size + 1f)) + (int)(cell.y * (size + 1f)) + (int)(cell.z) }; if (isBorderPoint) { borderPoins.Add(point); } points.Add(point); grid[i * size + j] = point; } } // add links for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { if (i + j >= size) { continue; } AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i + 1, j); AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i - 1, j); AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i, j + 1); AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i, j - 1); AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i - 1, j + 1); AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i + 1, j - 1); AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i + 1, j + 1); AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i - 1, j - 1); AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i - 1, j + 2); AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i - 2, j + 1); AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i + 2, j - 1); AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i + 1, j - 2); } } } // merge borders foreach (var point in borderPoins) { if (point.Neigbhors == null) { continue; } foreach (var merge in borderPoins) { if (merge == point) { continue; } if (merge.Neigbhors == null) { continue; } if (merge.PositionHash == point.PositionHash) { MergePoints(point, merge); break; } } } points.RemoveAll(point => point.Neigbhors == null); foreach (var point in points) { point.Distances = new List <float>(point.Neigbhors.Count); for (int i = 0; i < point.Neigbhors.Count; i++) { var distance = Vector3.Distance(point.Position, point.Neigbhors[i].Position); point.Distances.Add(distance); } } return(points); }