private IEnumerator ConfigureRaceWorker(RaceConfiguration config) { stage = RaceStage.Preparation; var operation = SceneManager.LoadSceneAsync(config.circuit.sceneName, LoadSceneMode.Additive); while (!operation.isDone) { yield return(null); } SceneManager.SetActiveScene(SceneManager.GetSceneByName(config.circuit.sceneName)); var scene = SceneManager.GetSceneByName(config.circuit.sceneName); var track = scene.GetRootGameObjects().Select(g => g.GetComponentInChildren <Track>()).Where(o => o != null).First(); var geometry = track.GetComponent <TrackGeometry>(); var cars = config.cars; competitors = new List <Competitor>(); laps = config.laps; int i = 0; for (; i < cars.Count; i++) { var item = cars[i]; var car = GameObject.Instantiate(item.Agent, geometry.transform); ResetController.PlacePrefab(car.transform, geometry, GridStartDistance(i), GridStartOffset(i)); competitors.Add(new Competitor(car)); } if (config.player != null) { var player = GameObject.Instantiate(config.player.Player, geometry.transform); ResetController.PlacePrefab(player.transform, geometry, GridStartDistance(i), GridStartOffset(i)); this.player = new Competitor(player); competitors.Add(this.player); } foreach (var item in competitors) { item.navigator.Lap = 0; } config.leaderboard.Clear(); foreach (var item in competitors) { var entry = new LeaderboardEntry(); entry.car = item.vehicle.name; entry.bestLap = float.PositiveInfinity; entry.place = competitors.IndexOf(item) + 1; if (item.vehicle.GetComponent <Agent>()) { entry.driver = item.vehicle.GetComponent <Agent>().DriverName; } else { entry.driver = "Player 1"; } config.leaderboard.Add(entry); item.entry = entry; } raceCamera.cameraRigs = competitors.Select(c => c.vehicle.GetComponentInChildren <CamRig>()).ToArray(); raceCamera.Target = competitors.Last().vehicle.GetComponent <CamRig>(); SendMessage("OnRacePrepared", this, SendMessageOptions.DontRequireReceiver); StartCoroutine(CountdownWorker()); }