public Path PlotPath() { if (Node.CanReach(transform.position, Player.player.transform.position, LayerMasks.CanNodeReachPlayer)) { return(new Path(new List <Node>(), Vector3.Distance(transform.position, Player.player.transform.position))); } IGraph subgraph = Graph.graph.GetSubgraph(transform.position); if (subgraph == null) { Debug.Log("Couldn't find subgraph"); return(null); } bool[] marked = new bool[Graph.graph.GraphNodes.Count]; for (int i = 0; i < subgraph.GraphNodes.Count; i++) { marked[i] = false; } PriorityQueue <ZombieState> queue = new PriorityQueue <ZombieState>(); for (int i = 0; i < subgraph.GraphNodes.Count; i++) { float distance = Vector3.Distance(transform.position, subgraph.GraphNodes[i].Component.transform.position); if (Node.CanReach(transform.position, subgraph.GraphNodes[i].Component.transform.position, LayerMasks.CanNodeReachPlayer) && distance != 0) { marked[subgraph.GraphNodes[i].ID] = true; ZombieState state = new ZombieState(subgraph.GraphNodes[i], distance); queue.Push(state.f, state); } } ZombieState goal = null; while (queue.IsEmpty() == false) { goal = queue.Pop(); if (goal.node.CanReachPlayer) { break; } for (int i = 0; i < goal.node.adjNodes.Count; i++) { if (marked[goal.node.adjNodes[i].node.ID] == false && goal.node.subIndex == goal.node.adjNodes[i].node.subIndex) { ZombieState state = new ZombieState(goal, goal.node.adjNodes[i]); marked[goal.node.adjNodes[i].node.ID] = true; queue.Push(state.f, state); } } } if (goal == null) { return(new Path(new List <Node>(), 0)); } return(goal.ToPath()); }