Esempio n. 1
0
 public PathRequest(Vector3 _start, Vector3 _end, INeighbourFilter _filter, Action <Vector3[], bool> _callback)
 {
     filter    = _filter;
     pathStart = _start;
     pathEnd   = _end;
     callback  = _callback;
 }
Esempio n. 2
0
        IEnumerator FindPath(Vector3 startPos, Vector3 targetPos, INeighbourFilter filter)
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();

            Vector3[] waypoints   = new Vector3[0];
            bool      pathSuccess = false;

            Node startNode  = grid.FindNearesPoint(startPos);
            Node targetNode = grid.FindNearesPoint(targetPos);

            startNode.parent = startNode;

            if (startNode.walkable && targetNode.walkable)
            {
                Heap <Node>    openSet   = new Heap <Node>(grid.MaxSize);
                HashSet <Node> closedSet = new HashSet <Node>();
                openSet.Add(startNode);

                while (openSet.Count > 0)
                {
                    Node currentNode = openSet.RemoveFirst();
                    closedSet.Add(currentNode);

                    if (currentNode == targetNode)
                    {
                        sw.Stop();
                        print("Path found: " + sw.ElapsedMilliseconds + " ms");
                        pathSuccess = true;
                        break;
                    }

                    foreach (Node neighbour in grid.GetNeighbours(currentNode))
                    {
                        if (filter != null && filter.FilterNeighbour(neighbour) == false)
                        {
                            continue;
                        }
                        if (!neighbour.walkable || closedSet.Contains(neighbour))
                        {
                            continue;
                        }

                        int newMovementCostToNeighbour = currentNode.gCost + GetDistance(currentNode, neighbour) + neighbour.movementPenalty;
                        if (newMovementCostToNeighbour < neighbour.gCost || !openSet.Contains(neighbour))
                        {
                            neighbour.gCost  = newMovementCostToNeighbour;
                            neighbour.hCost  = GetDistance(neighbour, targetNode);
                            neighbour.parent = currentNode;

                            if (!openSet.Contains(neighbour))
                            {
                                openSet.Add(neighbour);
                            }
                            else
                            {
                                openSet.UpdateItem(neighbour);
                            }
                        }
                    }
                }
            }

            yield return(null);

            if (pathSuccess)
            {
                waypoints = RetracePath(startNode, targetNode);
            }
            requestManager.FinishedProcessingPath(waypoints, pathSuccess);
        }
Esempio n. 3
0
 public void StartFindPath(Vector3 startPos, Vector3 targetPos, INeighbourFilter filter)
 {
     StartCoroutine(FindPath(startPos, targetPos, filter));
 }
Esempio n. 4
0
        public static void RequestPath(Vector3 pathStart, Vector3 pathEnd, Action <Vector3[], bool> callback, INeighbourFilter _filter)
        {
            PathRequest newRequest = new PathRequest(pathStart, pathEnd, _filter, callback);

            instance.pathRequestQueue.Enqueue(newRequest);
            instance.TryProcessNext();
        }