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());
    }