/** * This method simulates traffic spawning at the given in-game time. */ public void SimulateAtTime(float inGameTime) { // Calculate estimated relative traffic volume by averaging the relative traffic volume throughout the hour float lbRelativeTrafficVolume = CalculateRelativeTrafficVolumeAtTime(Mathf.FloorToInt(inGameTime)); float ubRelativeTrafficVolume = CalculateRelativeTrafficVolumeAtTime(Mathf.RoundToInt(inGameTime + 0.5f)); float relativeTrafficVolume = (lbRelativeTrafficVolume + ubRelativeTrafficVolume) / 2.0f; foreach (KeyValuePair <EntryRoad, List <Traffic> > trafficStartingAt in trafficsStartingAt) { if (inGameTime >= nextSpawnTimes[trafficStartingAt.Key]) { Path path = nextSpawnTraffics[trafficStartingAt.Key].Value.GetRandomPath(); LinkedListNode <Road> firstRoadNode = path.Roads.First; VehicleController vehicle = Instantiate( vehicleFactory.GetRandomVehicle(), firstRoadNode.Value.StartGrid.transform.position, firstRoadNode.Value.transform.rotation); vehicle.Initialize(firstRoadNode); // Add simulation manager as the speed observer vehicle.AddObserver(SiteManager.Instance.simulationManager); // Increment spawn time and move traffic iterator nextSpawnTimes[trafficStartingAt.Key] += 1.0f / (relativeTrafficVolume * trafficStartingAt.Value.Sum(i => i.TrafficVolume)); nextSpawnTraffics[trafficStartingAt.Key] = nextSpawnTraffics[trafficStartingAt.Key].Next; } } }