public void FindClosestNodes(NodeSearchSettings searchSettings) { Node[] nodeArray = FindObjectsOfType <Node>(); int numRailsWeNeed = _maxRails - rails.Count; List <NodeAndDistance> closestNodes = GetListOfClosestNodes(nodeArray, numRailsWeNeed, searchSettings); ConnectMeToListOfNodes(closestNodes); }
protected bool PassesRailLimitCheck(Node n, NodeSearchSettings searchSettings) { if (searchSettings.includeRegardlessOfMaxRails) { return(true); } else { return(!n.HasFullRails()); } }
protected bool IsNodeOkayToConnectTo(Node n, NodeSearchSettings searchSettings) { if (PassesRailLimitCheck(n, searchSettings)) { if (n != this) { if (!IsConnectedTo(n)) { if (!(n is PortalNode)) { return(true); } } } } return(false); }
private List <NodeAndDistance> GetListOfClosestNodes(Node[] nodeArray, int numRailsWeNeed, NodeSearchSettings searchSettings) { List <NodeAndDistance> closestNodes = new List <NodeAndDistance>(); for (int i = 0; i < nodeArray.Length; i++) { if (IsNodeOkayToConnectTo(nodeArray[i], searchSettings)) { float distance = Vector3.Distance(transform.position, nodeArray[i].transform.position); if (distance < _maxNodeDistance) { if (closestNodes.Count < numRailsWeNeed) { closestNodes.Add(new NodeAndDistance(nodeArray[i], distance)); continue; } else { for (int j = 0; j < closestNodes.Count; j++) { // hmmm we can make this part better eventually by replacing the one that's furthest away instead of the first one we happen to find... if (distance < closestNodes[j].distance) { closestNodes[j] = new NodeAndDistance(nodeArray[i], distance); break; } } continue; } } } } return(closestNodes); }