public GraphNodeRange(GraphNodeRange parent, GraphNode node) { Parent = parent; Node = node; if (Parent != null) { Depth = Parent.Depth + 1; Distance = Parent.Distance + Vector3.Distance((Vector3)Node.position, (Vector3)Parent.Node.position); } }
public HashList <GraphNode> GetDistanceRange(Vector3 pos, float distance, Func <GraphNode, bool> filter = null) { BFSQueue.Clear(); BFSResult.Clear(); BFSRange.Clear(); var depth = distance / NodeSize; GraphNode seed = GetNode(pos); Action <GraphNodeRange, GraphNode> callback = (parent, node) => { if (node.Walkable && !BFSResult.Contains(node)) { if (filter != null && !filter(node)) { return; } var nRangeItem = new GraphNodeRange(parent, node); if (nRangeItem.Distance > distance) { return; } if (nRangeItem.Depth > depth) { return; } BFSResult.Add(node); BFSQueue.Enqueue(node); BFSRange.Add(node, nRangeItem); } }; callback(null, seed); while (BFSQueue.Count > 0) { GraphNode n = BFSQueue.Dequeue(); GraphNodeRange nRangeItem = BFSRange[n]; if (nRangeItem.Distance > distance) { break; } if (nRangeItem.Depth > depth) { break; } n.GetConnections((x) => { callback(nRangeItem, x); }); } return(BFSResult); }