public KeyValuePair <Vector2, float>[] route(Vector2 origin, Vector2 destiny) { List <KeyValuePair <Vector2, float> > ret = new List <KeyValuePair <Vector2, float> > (); LineHandler origin_line = null, destiny_line = null; foreach (LineHandler handler in lines) { if (origin_line == null && handler.contains(origin)) { origin_line = handler; } if (destiny_line == null && handler.contains(destiny)) { destiny_line = handler; } if (origin_line != null && destiny_line != null) { break; } } Vector2 closest = Vector2.zero; if (origin_line == null) { closest = closestPoint(PlayerMB.Instance.getPosition()); foreach (LineHandler handler in lines) { if (origin_line == null && handler.contains(closest)) { origin_line = handler; break; } } } if (closest != Vector2.zero) { ret.Add(new KeyValuePair <Vector2, float>(closest, origin_line.getScaleFor(closest))); } if (origin_line != null && destiny_line != null) { //###################################################### // IF ORIGIN_LINE AND DESTINY_LINE ARE THE SAME // Return only the destiny point, dont have to go // to other node //###################################################### if (origin_line == destiny_line) { ret.Add(new KeyValuePair <Vector2, float>(destiny, destiny_line.getScaleFor(destiny))); } else { List <KeyValuePair <Vector2, float> > tmpRoute = new List <KeyValuePair <Vector2, float> >(reach(origin_line, destiny_line)); //tmpRoute.Reverse (); ret.AddRange(tmpRoute); ret.Add(new KeyValuePair <Vector2, float>(destiny, destiny_line.getScaleFor(destiny))); } } return(ret.ToArray()); }