private void OnSceneGUI() { var linkmap = (KuroiLinkMap)target; var navmesh = linkmap.NavMesh; if (navmesh == null) { return; } var navigationNodes = linkmap.nodes; if (navigationNodes == null || navigationNodes.Length != navmesh.Area) { return; } var grid = navmesh.grid; var mousePos = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition).origin; var mouseCell = grid.WorldToCell(mousePos); if (drawHeat) { var nodes = navmesh.Nodes; if (nodes == null || nodes.Length != navmesh.Area) { return; } var highest = WithMostConnectionIndex; var min = navmesh.Min; var max = navmesh.Max; for (var x = min.x; x <= max.x; x++) { for (var y = min.y; y <= max.y; y++) { var index = navmesh.IndexOfUnsafe(x, y); var other = navmesh.Nodes[index]; if (other.IsSolid()) { continue; } var node = navigationNodes[index]; var c = node.directLinks.Length + node.gravitationalLinks.Length; if (c == 0) { continue; } var color = Color.black; color.r = ((float)c / highest); color.a = 1; UnityX.DrawCell(x, y, navmesh.grid, color, Color.clear); } } } /*Handles.DrawSolidRectangleWithOutline( * new Rect( * (Vector2) mousePos - linkmap.hitBoxSize / 2, linkmap.hitBoxSize), * Color.red, * Color.clear * );*/ for (var x = -linkRadius; x <= linkRadius; x++) { for (var y = -linkRadius; y <= linkRadius; y++) { var gridPos = new Vector3Int(x, y, 0) + mouseCell; var index = navmesh.IndexOfUnsafe(gridPos.x, gridPos.y); if (index > navmesh.Nodes.Length) { continue; } var origin = grid.GetCellCenterWorld(gridPos); var node = navigationNodes[index]; if (drawDirect) { foreach (var link in node.directLinks) { var nI = (Vector3Int)navmesh.PositionOf(link.Destination); var pos = grid.GetCellCenterWorld(nI); var neightboor = navmesh.Nodes[link.Destination]; var dir = pos - origin; var n = dir.normalized; var color = new Color((n.x + 1) / 2, (n.y + 1) / 2, 1); EditorX.ForHandles(origin, dir, color); } } if (drawGravitational) { foreach (var link in node.gravitationalLinks) { var nI = (Vector3Int)navmesh.PositionOf(link.Destination); var pos = grid.GetCellCenterWorld(nI); float size = 4; var p = link.Path; for (int i = 0; i < p.Length - 1; i++) { var current = p[i]; var next = p[i + 1]; var dir = next - current; dir.Normalize(); var color = new Color((dir.x + 1) / 2, (dir.y + 1) / 2, 0); var prog = (float)i / p.Length; color.b = prog; color.a = 0.5F + (prog / 2); Handles.color = color; Handles.DrawLine(current, next); } } } } } var radius = new Vector2Int(linkRadius, linkRadius); Handles.color = Color.red; EditorX.DrawBoundaries( (Vector2Int)mouseCell - radius, (Vector2Int)mouseCell + radius, grid ); }
private void DrawNodes(KuroiNavMesh navmesh) { var nodes = navmesh.Nodes; if (nodes == null || nodes.Length != navmesh.Area) { return; } var min = navmesh.Min; var max = navmesh.Max; for (var x = min.x; x <= max.x; x++) { for (var y = min.y; y <= max.y; y++) { var index = navmesh.IndexOfUnsafe(x, y); var node = nodes[index]; if (!drawSolids && node.IsSolid()) { continue; } if (!drawEmpty && node.IsEmpty()) { continue; } Color color = Color.black; color.a = node.IsSolid() ? 0.9F : 0.5f; Color outlineColor = Color.black; if (node.IsSupported()) { color.g = 1; } if (node.IsLeftWall()) { color.r = 1; } if (node.IsRightWall()) { color.b = 1; } if (node.IsLeftEdge()) { //color.r = 1; outlineColor.r = 1; } if (node.IsRightEdge()) { //color.b = 1; outlineColor.b = 1; } UnityX.DrawCell(x, y, navmesh.grid, color, outlineColor); } } }