void PickRandomTrip()
    {
        var streetPoints = GameObject.FindGameObjectsWithTag("streetPoint");

        startNode = streetPoints[(int)Random.Range(0, streetPoints.Length - 1)].GetComponent <NodeHandler>().node;
        endNode   = streetPoints[(int)Random.Range(0, streetPoints.Length - 1)].GetComponent <NodeHandler>().node;
    }
Пример #2
0
    /// <summary>
    /// Instantiate the truck and send it to the predefined destinations
    /// </summary>
    /// <param name="destinations"></param>
    private void SendTruck(List <NodeStreet> destinations)
    {
        spawnPoint = GetComponentInChildren <SpawnPointHandler>().node;
        var truck = Instantiate(garbageTruck, Utils.Down(spawnPoint.nodePosition) + Vector3.up, Quaternion.identity);

        Utils.SendVehicleFromTo(spawnPoint, destinations[0], truck);
        truck.GetComponent <TruckAIController>().destinations = destinations;
    }
 public WHWorker(int adultIndex, HUEconomy myHUEconomy, HUCarsHandler myHUCarsHandler, System.DateTime workingStart, int workingHours, NodeStreet workSpawn, Quaternion rot)
 {
     this.myHUEconomy     = myHUEconomy;
     this.myHUCarsHandler = myHUCarsHandler;
     this.workingStart    = workingStart;
     this.workingHours    = workingHours;
     this.adultIndex      = adultIndex;
     this.workSpawn       = workSpawn;
     this.rot             = rot;
 }
    private void CheckAtPositionForNodesFromCross(Vector3 checkPos, NodeStreet curNode, float radius = 2f)
    {
        var colls = Physics.OverlapSphere(checkPos, radius, LayerMask.GetMask("network"));

        foreach (Collider c in colls)
        {
            var nextNode  = c.gameObject.GetComponent <NodeHandler>().node;
            var curStreet = new ArcStreet(curNode, nextNode);
            curNode.AddStreet(curStreet);
        }
    }
Пример #5
0
 public void InitializeNode()
 {
     if (node == null)
     {
         node = new NodeStreet(transform.position - (Vector3.up * transform.position.y));
     }
     else
     {
         node.nodePosition = transform.position - (Vector3.up * transform.position.y);
         node.availableStreets.Clear();
     }
 }
    public static List <NodeStreet> PathFromTo(NodeStreet startNode, NodeStreet endNode, GameObject vehicle)
    {
        // pathfinding
        var pathFinder = new AStar(startNode, endNode, vehicle);
        var found      = pathFinder.PathFinder();
        var path       = new List <NodeStreet>();

        foreach (NodeStreet n in pathFinder.path)
        {
            path.Add(n);
        }

        return(path);
    }
Пример #7
0
    public static void SendVehicleFromTo(NodeStreet startNode, NodeStreet endNode, GameObject vehicle)
    {
        var path = AStar.PathFromTo(startNode, endNode, vehicle);

        if (path.Count > 0)
        {
            vehicle.transform.LookAt(path[0].nodePosition);
            vehicle.GetComponent <VehicleAIController>().nextWaypoint = path[0];
            vehicle.GetComponent <VehicleAIController>().waypoints    = path;
            vehicle.GetComponent <VehicleAIController>().arrivalNode  = endNode;
            return;
        }
        Debug.Log("Path not found");
    }
Пример #8
0
    public IEnumerator ShopperResender(int hours, NodeStreet backNode, GameObject actualWorkerCar, GameObject workerCarModel, int minutes = 0)
    {
        while (Vector3.Distance(Utils.Down(transform.position), actualWorkerCar.transform.position) > 5)
        {
            yield return(new WaitForFixedUpdate());
        }

        yield return(new WaitForSeconds((hours * 3600 + minutes * 60) / Settings.timeMultiplyer));

        var startNode = GetComponentInChildren <SpawnPointHandler>().node;
        var car       = Instantiate(workerCarModel, startNode.nodePosition, transform.rotation);

        Utils.SendVehicleFromTo(startNode, backNode, car);
    }
    public GameObject WorkerMoving(NodeStreet startNode, NodeStreet endNode, Quaternion rot)
    {
        if (startNode == null || endNode == null)
        {
            return(null);
        }
        else
        {
            var worker = Instantiate(car, startNode.nodePosition + Vector3.up, rot, carsManager.garage.transform);
            StartCoroutine(SendWorker(startNode, endNode, worker));

            return(worker);
        }
    }
Пример #10
0
    public AStar(NodeStreet startNode, NodeStreet endNode, GameObject vehicle)
    {
        // Initialize the set of nodes and the path
        openedNodes = new List <NodeStreet>();
        closedNodes = new HashSet <NodeStreet>();
        path        = new List <NodeStreet>();

        this.vehicle = vehicle;

        // Setting a reference for the start and the end node
        this.startNode = startNode;
        this.endNode   = endNode;

        // adding the start node to the opened ones list
        openedNodes.Add(startNode);
    }
Пример #11
0
    /// <summary>
    /// Finding the nearest node within radius
    /// </summary>
    /// <param name="pos"></param>
    /// <param name="radius"></param>
    /// <returns></returns>
    public static NodeStreet NearestNode(Vector3 pos, float radius = 14)
    {
        NodeStreet nearNode = null;

        float minDist = Mathf.Infinity;
        var   colls   = Physics.OverlapSphere(pos, radius, LayerMask.GetMask("network"));

        foreach (Collider c in colls)
        {
            if (Vector3.Distance(pos, c.gameObject.transform.position) < minDist)
            {
                minDist  = Vector3.Distance(pos, c.gameObject.transform.position);
                nearNode = c.gameObject.GetComponent <NodeHandler>().node;
            }
        }

        return(nearNode);
    }
Пример #12
0
    private float GetDistance(NodeStreet a, NodeStreet b)
    {
        // Checking if nodes are connected
        ArcStreet connectingStreet = null;
        bool      isConnected      = false;

        foreach (ArcStreet fromA in a.availableStreets)
        {
            if (fromA.arrivalNode.Equals(b))
            {
                isConnected      = true;
                connectingStreet = fromA;
                break;
            }
        }
        if (!isConnected)
        {
            return(Vector3.Distance(a.nodePosition, b.nodePosition));
        }
        //return Mathf.Infinity;

        return(connectingStreet.lenght);
    }
Пример #13
0
    private IEnumerator Connect(Vector3 PosToCheck)
    {
        yield return(new WaitForFixedUpdate());

        yield return(new WaitForFixedUpdate());

        var colls = Physics.OverlapSphere(PosToCheck, 5f, LayerMask.GetMask("network"));

        if (colls.Length == 0)
        {
            StartCoroutine(Connect(transform.position + transform.forward * 7 + transform.right * 3));
            yield return(null);
        }
        else
        {
            NodeStreet nearestNode = colls[0].gameObject.GetComponent <NodeHandler>().node;
            foreach (Collider c in colls)
            {
                var nextNode = c.gameObject.GetComponent <NodeHandler>().node;

                if (Vector3.Distance(transform.position, c.gameObject.transform.position) <
                    Vector3.Distance(transform.position, nearestNode.nodePosition))
                {
                    nearestNode = nextNode;
                }
            }

            // Linking it to me
            var linkingStret = new ArcStreet(nearestNode, node);
            nearestNode.AddStreet(linkingStret);

            // Linking me to it
            var curStreet = new ArcStreet(node, nearestNode);
            node.AddStreet(curStreet);
        }
    }
 public ArcStreet(NodeStreet startNode, NodeStreet arrivalNode)
 {
     this.startNode   = startNode;
     this.arrivalNode = arrivalNode;
 }
Пример #15
0
 void GO()
 {
     startNode = startPoint.GetComponent <NodeHandler>().node;
     endNode   = endPoint.GetComponent <NodeHandler>().node;
 }
 private void CheckAtPositionForNodesFromStreetPoint(Collider[] colls, GameObject streetPoint, NodeStreet curNode)
 {
     foreach (Collider c in colls)
     {
         var nextNode  = c.gameObject.GetComponent <NodeHandler>().node;
         var curStreet = new ArcStreet(curNode, nextNode);
         curNode.AddStreet(curStreet);
     }
 }
Пример #17
0
    public bool PathFinder()
    {
        while (openedNodes.Count > 0)
        {
            // Finding the best node from all the opened nodes
            NodeStreet currentNode = openedNodes[0];
            for (int i = 1; i < openedNodes.Count; i++)
            {
                var node = openedNodes[i];
                if (node.fCost < currentNode.fCost | (node.fCost == currentNode.fCost && node.hCost < currentNode.hCost))
                {
                    currentNode = node;
                }
            }
            openedNodes.Remove(currentNode);
            closedNodes.Add(currentNode);

            // cheching for the finding path condition
            if (currentNode.Equals(endNode))
            {
                RetracePath();
                return(true);
            }

            // Analyzing neighbors
            var neighbours = currentNode.GetNeighbors();

            foreach (NodeStreet neighbour in neighbours)
            {
                // the neighbor has already been explored
                if (closedNodes.Contains(neighbour))
                {
                    continue;
                }

                // Extra cost to avoid traffic jam on single lane
                float   carPresence = 0;
                Vector3 ext         = Vector3.one;
                var     dir         = neighbour.nodePosition - currentNode.nodePosition;
                if (Mathf.Abs(dir.x) > Mathf.Abs(dir.z))
                {
                    ext += Vector3.right * (14 - 2);
                }
                else
                {
                    ext += Vector3.forward * (14 - 2);
                }

                var colls = Physics.OverlapBox(neighbour.nodePosition, ext, Quaternion.identity, LayerMask.GetMask("vehicle"));
                foreach (Collider c in colls)
                {
                    if (c.gameObject != vehicle)
                    {
                        carPresence += carCost;
                    }
                }

                float newMovementCostToNeighbour = currentNode.gCost + GetDistance(currentNode, neighbour) + carPresence;
                if (newMovementCostToNeighbour < neighbour.gCost | !openedNodes.Contains(neighbour))
                {
                    neighbour.gCost  = newMovementCostToNeighbour;
                    neighbour.hCost  = GetDistance(neighbour, endNode);
                    neighbour.parent = currentNode;

                    if (!openedNodes.Contains(neighbour))
                    {
                        openedNodes.Add(neighbour);
                    }
                }
            }
        }
        return(false);
    }
    private IEnumerator SendWorker(NodeStreet startNode, NodeStreet endNode, GameObject worker)
    {
        yield return(new WaitForFixedUpdate());

        Utils.SendVehicleFromTo(startNode, endNode, worker);
    }
 public void RemoveNode(int index)
 {
     arrivalNode = null;
 }