public Queue <PathfindingNode> CalculatePath(PathfindingNode origin, PathfindingNode target)
    {
        Open   = new List <ConsideredNode>();
        Closed = new List <ConsideredNode>();

        Open.Add(new ConsideredNode(origin, null, CalculateDirectTravelCost(origin, target)));

        while (true)
        {
            ConsideredNode currentNode = GetLowestCostNode(Open);
            if (currentNode == null)
            {
                Debug.LogError("Could not find path");
                return(new Queue <PathfindingNode>());
            }

            Open.Remove(currentNode);
            Closed.Add(currentNode);

            if (currentNode.Info == target)
            {
                List <PathfindingNode> reversedPath = new List <PathfindingNode>();
                while (currentNode != null)
                {
                    reversedPath.Add(currentNode.Info);
                    currentNode = currentNode.Parent;
                }
                Queue <PathfindingNode> path = new Queue <PathfindingNode>();
                while (reversedPath.Count > 1)
                {
                    path.Enqueue(reversedPath[reversedPath.Count - 2]);
                    reversedPath.RemoveAt(reversedPath.Count - 2);
                }
                return(path);
            }

            foreach (PathfindingNode neighbour in Grid.GetNeighbourNodes(currentNode.Info))
            {
                if (neighbour.IsWalkable == false || Closed.Find(n => n.Info == neighbour) != null)
                {
                    continue;
                }

                ConsideredNode neighbourNode = Open.Find(n => n.Info == neighbour);
                if (neighbourNode == null)
                {
                    neighbourNode = new ConsideredNode(neighbour, currentNode, CalculateDirectTravelCost(neighbour, target));
                    Open.Add(neighbourNode);
                }
                else
                {
                    float newTravelCost = currentNode.TravelCost + CalculateDirectTravelCost(currentNode.Info, neighbour);
                    if (neighbourNode.TravelCost > newTravelCost)
                    {
                        neighbourNode.SetParent(currentNode);
                    }
                }
            }
        }
    }
    private ConsideredNode GetLowestCostNode(List <ConsideredNode> List)
    {
        int            currentNodeCost = int.MaxValue;
        ConsideredNode currentNode     = null;

        foreach (ConsideredNode node in List)
        {
            if (node.TotalCost < currentNodeCost)
            {
                currentNodeCost = node.TotalCost;
                currentNode     = node;
            }
        }

        return(currentNode);
    }
 public void SetParent(ConsideredNode parent)
 {
     this.Parent = parent;
 }
 public ConsideredNode(PathfindingNode nodeInfo, ConsideredNode parent, int directTravelCostToTarget)
 {
     this.Info = nodeInfo;
     this.DirectTravelCostToTarget = directTravelCostToTarget;
     this.SetParent(parent);
 }