Ejemplo n.º 1
0
 public void Update()
 {
     if (timer < 0)
     {
         Node newClosest = manager.ClosestNodeToPoint(transform.position);
         if (newClosest != closestNode)
         {
             eventToRaise.Raise();
             closestNode = newClosest;
         }
         timer = tickRate;
     }
     else
     {
         timer -= Time.deltaTime;
     }
 }
Ejemplo n.º 2
0
    List <Node> AStar()
    {
        InitializeAStarDictionary();

        AStarNode startNode = nodeToAStarNode[manager.ClosestNodeToPoint(transform.position)];
        AStarNode endNode   = nodeToAStarNode[manager.ClosestNodeToPoint(target)];

        //Set targets for everybody
        foreach (Node node in manager.nodeList)
        {
            nodeToAStarNode[node].SetTarget(endNode);
        }

        AStarNode currentNode = startNode;

        Heap <AStarNode> open = new Heap <AStarNode>(manager.nodeList.Count);

        open.Add(currentNode);

        bool pathSolved = false;

        int safeCounter = 0;

        while (open.Count > 0)
        {
            safeCounter++;
            if (safeCounter > 9999)
            {
                UnityEngine.Debug.LogWarning("Timed out!");
                break;
            }

            //Find the lowest f in open, then set it to current node
            currentNode = open.RemoveFirst();


            //If current node is end...
            if (currentNode == endNode)
            {
                pathSolved = true;
                break;
            }

            //Loop through neighbors
            foreach (Node nodeNeighbor in currentNode.node.GetNeighbors())
            {
                AStarNode neighbor = nodeToAStarNode[nodeNeighbor];

                //If neighbor is already explored... continue
                if (neighbor.IsExplored())
                {
                    continue;
                }

                //Old G cost
                float oldG = neighbor.G;

                //If neighbor is already in open...
                if (open.Contains(neighbor))
                {
                    //And new g cost is less than old g cost...
                    float newG = Node.Distance(neighbor.node, currentNode.node);
                    if (newG < oldG)
                    {
                        //Make this the new parent
                        neighbor.SetParent(currentNode); //This sets parent and sets g value
                        open.UpdateItem(neighbor);
                    }
                }
                else     //otherwise
                //Set this to parent and add neighbor to open
                {
                    neighbor.SetParent(currentNode);
                    open.Add(neighbor);
                }
            }

            //Explores current node
            currentNode.CloseNode();
        }

        if (pathSolved)
        {
            List <Node> path = new List <Node>();

            AStarNode n = currentNode;
            while (n != startNode)
            {
                path.Add(n.node);
                n = n.GetParent();
            }
            path.Reverse();
            return(path);
        }
        return(null);
    }
Ejemplo n.º 3
0
 private void Start()
 {
     manager     = PathfindingNodeManager.INSTANCE;
     closestNode = manager.ClosestNodeToPoint(transform.position);
 }