示例#1
0
    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());
    }