private void CreateLinkBetweenSelected() { // get list of selected nodes List <TileNode> nodes = new List <TileNode>(); foreach (GameObject go in Selection.gameObjects) { TileNode n = go.GetComponent <TileNode>(); if (n != null) { nodes.Add(n); } } // now update links between these nodes foreach (TileNode n in nodes) { TNEForcedLink ls = n.gameObject.GetComponent <TNEForcedLink>(); if (ls == null) { ls = n.gameObject.AddComponent <TNEForcedLink>(); } // set link state with all other selected nodes foreach (TileNode n2 in nodes) { if (n2 != n) { ls.LinkWith(n2); } } } }
static void RenderTileNodeGizmo(TileNode node, GizmoType gizmoType) { if (node.mapnav == null) { return; } Vector3 position = node.transform.position; Vector3 gizmoSize = TileNode.GizmoSize * (node.mapnav.tileSpacing / TileNode.GizmoSizeDiv); // draw cube(s) for node if (node.mapnav.gizmoDrawNodes || ((gizmoType & GizmoType.Selected) != 0)) { if ((gizmoType & GizmoType.Selected) != 0) { Gizmos.color = Color.red; Gizmos.DrawCube(position, gizmoSize); } else if (node.mapnav.gizmoColorCoding) { bool drawn = false; Vector3 offs = Vector3.zero; for (int i = 0; i < TileNode.GizmoColourCoding.Length; i++) { int t = (int)Mathf.Pow(2, i); if (((int)node.tileTypeMask & t) == t) { Gizmos.color = TileNode.GizmoColourCoding[i]; Gizmos.DrawCube(position + offs, gizmoSize); offs.y += gizmoSize.y; drawn = true; } } if (!drawn) { Gizmos.color = Color.black; Gizmos.DrawCube(position, gizmoSize); } } else { Gizmos.color = Color.black; Gizmos.DrawCube(position, gizmoSize); } } // draw the node links if (node.nodeLinks != null && (node.mapnav.gizmoDrawLinks || (gizmoType & GizmoType.Selected) != 0)) { TNELinksOnOffSwitch linkSwitch = node.gameObject.GetComponent <TNELinksOnOffSwitch>(); foreach (TileNode n in node.nodeLinks) { if (n != null) { Gizmos.color = Color.blue; if (linkSwitch != null) { // check if lik is on with neighbour if (linkSwitch.LinkIsOn(n) == 0) { Gizmos.color = Color.red; } } TNELinksOnOffSwitch nls = n.gameObject.GetComponent <TNELinksOnOffSwitch>(); if (nls != null) { // check if neighbour's link with me is on if (nls.LinkIsOn(node) == 0) { Gizmos.color = Color.red; } } Gizmos.DrawLine(position, n.transform.position); } } // look for forced links TNEForcedLink fl = node.gameObject.GetComponent <TNEForcedLink>(); if (fl != null) { foreach (TileNode link in fl.links) { if (link == null) { continue; } Gizmos.DrawLine(position, link.transform.position); } } } }
/// <summary> /// Links TileNodes with their neighbouring nodes /// </summary> public void LinkNodes() { if (nodesCache == null) { return; } if (nodesCache.Length == 0) { return; } if (nodesCache.Length != nodesXCount * nodesYCount) { Debug.LogWarning(string.Format("The number of cached nodes {0} != {1} which was expected", nodesCache.Length, (nodesXCount * nodesYCount))); return; } nodes = new TileNode[nodesCache.Length]; bool atoffs = false; int i = 0; // === link nodes with their neighbours (hex tile pattern) if (tilesLayout == TilesLayout.Hex) { atoffs = false; for (int y = 0; y < nodesYCount; y++) { for (int x = 0; x < nodesXCount; x++) { i = y * nodesXCount + x; if (nodesCache[i] == null) { nodes[i] = null; continue; } TileNode n = nodesCache[i].GetComponent <TileNode>(); nodes[i] = n; // cache the component n.nodeLinks = new TileNode[6] { null, null, null, null, null, null }; // link with previous node if (x - 1 >= 0) { n.nodeLinks[0] = nodesCache[i - 1] == null ? null : nodesCache[i - 1].GetComponent <TileNode>(); } // link with next node if (x + 1 < nodesXCount) { n.nodeLinks[1] = nodesCache[i + 1] == null ? null : nodesCache[i + 1].GetComponent <TileNode>(); } // link with nodes in previous row if (y > 0) { // prev row, same column n.nodeLinks[2] = nodesCache[i - nodesXCount] == null ? null : nodesCache[i - nodesXCount].GetComponent <TileNode>();; if (atoffs) { // prev row, next column if (x + 1 < nodesXCount) { n.nodeLinks[4] = nodesCache[i - nodesXCount + 1] == null ? null : nodesCache[i - nodesXCount + 1].GetComponent <TileNode>(); } } else { // prev row, prev column if (x - 1 >= 0) { n.nodeLinks[4] = nodesCache[i - nodesXCount - 1] == null ? null : nodesCache[i - nodesXCount - 1].GetComponent <TileNode>(); } } } // link with nodes in next row if (y + 1 < nodesYCount) { // next row, same column n.nodeLinks[3] = nodesCache[i + nodesXCount] == null ? null : nodesCache[i + nodesXCount].GetComponent <TileNode>(); if (atoffs) { // prev row, next column if (x + 1 < nodesXCount) { n.nodeLinks[5] = nodesCache[i + nodesXCount + 1] == null ? null : nodesCache[i + nodesXCount + 1].GetComponent <TileNode>(); } } else { // prev row, prev column if (x - 1 >= 0) { n.nodeLinks[5] = nodesCache[i + nodesXCount - 1] == null ? null : nodesCache[i + nodesXCount - 1].GetComponent <TileNode>(); } } } } atoffs = !atoffs; } } // === link nodes with their neighbours (square tile pattern with 4 neighbours) if (tilesLayout == TilesLayout.Square_4) { for (int y = 0; y < nodesYCount; y++) { for (int x = 0; x < nodesXCount; x++) { i = y * nodesXCount + x; if (nodesCache[i] == null) { nodes[i] = null; continue; } TileNode n = nodesCache[i].GetComponent <TileNode>(); nodes[i] = n; // cache the component n.nodeLinks = new TileNode[4] { null, null, null, null }; // link with previous node if (x - 1 >= 0) { n.nodeLinks[0] = nodesCache[i - 1] == null ? null : nodesCache[i - 1].GetComponent <TileNode>(); } // link with next node if (x + 1 < nodesXCount) { n.nodeLinks[1] = nodesCache[i + 1] == null ? null : nodesCache[i + 1].GetComponent <TileNode>(); } // prev row, same column if (y > 0) { n.nodeLinks[2] = nodesCache[i - nodesXCount] == null ? null : nodesCache[i - nodesXCount].GetComponent <TileNode>(); } // next row, same column if (y + 1 < nodesYCount) { n.nodeLinks[3] = nodesCache[i + nodesXCount] == null ? null : nodesCache[i + nodesXCount].GetComponent <TileNode>(); } ; } } } //=== link nodes with their neighbours (square tile pattern with 8 neighbours) if (tilesLayout == TilesLayout.Square_8) { for (int y = 0; y < nodesYCount; y++) { for (int x = 0; x < nodesXCount; x++) { i = y * nodesXCount + x; if (nodesCache[i] == null) { nodes[i] = null; continue; } TileNode n = nodesCache[i].GetComponent <TileNode>(); nodes[i] = n; // cache the component n.nodeLinks = new TileNode[8] { null, null, null, null, null, null, null, null }; // link with previous node if (x - 1 >= 0) { n.nodeLinks[0] = nodesCache[i - 1] == null ? null : nodesCache[i - 1].GetComponent <TileNode>(); } // link with next node if (x + 1 < nodesXCount) { n.nodeLinks[1] = nodesCache[i + 1] == null ? null : nodesCache[i + 1].GetComponent <TileNode>(); } // link with nodes in previous row if (y > 0) { // prev row, same column n.nodeLinks[2] = nodesCache[i - nodesXCount] == null ? null : nodesCache[i - nodesXCount].GetComponent <TileNode>(); // prev row, prev column if (x - 1 >= 0) { n.nodeLinks[4] = nodesCache[i - nodesXCount - 1] == null ? null : nodesCache[i - nodesXCount - 1].GetComponent <TileNode>(); } // prev row, next column if (x + 1 < nodesXCount) { n.nodeLinks[6] = nodesCache[i - nodesXCount + 1] == null ? null : nodesCache[i - nodesXCount + 1].GetComponent <TileNode>(); } } // link with nodes in next row if (y + 1 < nodesYCount) { // next row, same column n.nodeLinks[3] = nodesCache[i + nodesXCount] == null ? null : nodesCache[i + nodesXCount].GetComponent <TileNode>(); // prev row, prev column if (x - 1 >= 0) { n.nodeLinks[5] = nodesCache[i + nodesXCount - 1] == null ? null : nodesCache[i + nodesXCount - 1].GetComponent <TileNode>(); } // prev row, next column if (x + 1 < nodesXCount) { n.nodeLinks[7] = nodesCache[i + nodesXCount + 1] == null ? null : nodesCache[i + nodesXCount + 1].GetComponent <TileNode>(); } } } } } // === init forced links foreach (TileNode node in nodes) { if (node == null) { continue; } TNEForcedLink fl = node.gameObject.GetComponent <TNEForcedLink>(); if (fl != null) { foreach (TileNode link in fl.links) { if (link == null) { continue; } // check if node not allready linked bool found = false; foreach (TileNode n in node.nodeLinks) { if (n == link) { found = true; break; } } // add if not found if (!found) { // find a null spot to add it in int addIdx = -1; for (int k = 0; k < node.nodeLinks.Length; k++) { if (node.nodeLinks[k] == null) { addIdx = k; break; } } if (addIdx >= 0) { // found an open slot, add into it node.nodeLinks[addIdx] = link; } else { // no open slot, expand the array TileNode[] temp = new TileNode[node.nodeLinks.Length]; node.nodeLinks.CopyTo(temp, 0); node.nodeLinks = new TileNode[node.nodeLinks.Length + 1]; temp.CopyTo(node.nodeLinks, 0); node.nodeLinks[node.nodeLinks.Length - 1] = link; } } } } } }