public NodeForEdit FindRoad(NodeForEdit src, NodeForEdit.MoveDir dir) { Vector2 dpos = src.pos + src.dir[(int)dir]; foreach (var dn in nodes) { if (dn.pos == dpos) { return(dn); } } return(null); }
void LinkNode(NodeForEdit src, NodeForEdit.MoveDir dir) { NodeForEdit dest = map.FindRoad(src, dir); int did = (int)dir; if (dest != null) { src.road[did] = !src.road[did]; } else { dest = AddNewNode(src.name); dest.pos = src.pos + src.dir[did]; src.road[did] = true; dest.road[(did + 4) % 8] = true; } SceneView.RepaintAll(); }
private void OnSceneGUI() { if (map.nodes == null) { map.nodes = new List <NodeForEdit>(); } if (map.nodes.Count == 0) { AddNewNode("NewNode"); } float size = 5;// HandleUtility.GetHandleSize(Vector3.zero); float fSize = HandleUtility.GetHandleSize(Vector3.zero); f0.fontSize = (int)(20 * size / fSize); f0.fontSize = Mathf.Clamp(f0.fontSize, 5, 100); for (int i = 0; i < map.nodes.Count; i++) { if (map.nodes[i] == null || !map.nodes[i].hasInit) { continue; } NodeForEdit node = map.nodes[i]; Vector3 dpos = Map2World(node.pos, size); if (pickedNode != node) { f0.normal.textColor = Color.white; } else { f0.normal.textColor = Color.black; Handles.CubeCap(0, dpos, Quaternion.identity, size * 2); } Vector3 lPos = dpos + Vector3.left * size * .9f + Vector3.up * size * .9f; Handles.Label(lPos, node.name + "[" + node.id + "]", f0); if (Handles.Button(dpos, Quaternion.identity, size, size, Handles.RectangleCap) && pickedNode != node) { pickedNode = node; Repaint(); } foreach (var val in node.npcs) { lPos += Vector3.down * f0.fontSize * .02f * size; Handles.Label(lPos, val.name + "[" + val.id + "]", f0); } foreach (var val in node.items) { lPos += Vector3.down * f0.fontSize * .02f * size; Handles.Label(lPos, val.name + "[" + val.id + "]", f0); } if (node == pickedNode) { Handles.color = Color.cyan; } foreach (var e in Enum.GetValues(typeof(NodeForEdit.MoveDir))) { NodeForEdit.MoveDir key = (NodeForEdit.MoveDir)e; int did = (int)key; if (node.road[did]) { NodeForEdit dest = map.FindRoad(node, key); if (dest == null) { node.road[did] = false; SceneView.RepaintAll(); continue; } if (dest == pickedNode) { Handles.color = Color.yellow; } Vector3 p1 = Map2World(node.pos, size); Vector3 p2 = Map2World(dest.pos, size); Vector3 dp = (p2 - p1).normalized * size; p1 += dp; p2 -= dp; if (p1.x != p2.x && p1.y != p2.y) { p1 += dp * .5f; p2 -= dp * .5f; } float fx = p1.y < p2.y ? -1 : 1; fx = p1.y == p2.y ? 0 : fx; float fy = p1.x > p2.x ? -1 : 1; fy = p1.x == p2.x ? 0 : fy; Vector3 fix = new Vector3(fx, fy, 0) * size * .05f; if (p1.x != p2.x && p1.y != p2.y) { fix *= 0.7f; } p1 += fix; p2 += fix; Handles.DrawLine(p1, p2); // 画箭头部分 Vector3 dir = (p2 - p1).normalized; dir = Quaternion.Euler(0, 0, 90) * dir; p1 += dir * size; dir = (p2 - p1).normalized * size * .2f; p1 = p2 - dir; Handles.DrawLine(p1, p2); } } Handles.color = Color.white; } }