Пример #1
0
    public void GenerateSolarSystem()
    {
        System.Random rand = new System.Random();

        //for generating a new solar system on the fly
        if (_solarSystem.Planets != null)
        {
            foreach (Planet p in _solarSystem.Planets)
            {
                Destroy(p.gameObject);
            }
            _solarSystem.Planets.Clear();
        }


        if (_solarSystem.Star != null)
        {
            Destroy(_solarSystem.Star.gameObject);
        }

        GameObject starGameObject = Instantiate(SolarSystemPrefabs.StarPrefab, transform.position, Quaternion.identity, this.transform);

        Star star = starGameObject.GetComponent <Star>();

        star.Name = StarName.Generate(rand);

        float starSize = Random.Range(Settings.MinStarSize, Settings.MaxStarSize) * Settings.SizeScale;

        star.Size = new Vector3(starSize, starSize, starSize);

        _solarSystem.Star = star;


        int   planetAmount       = Random.Range(Settings.MinPlanets, Settings.MaxPlanets);
        float lastPlanetDistance = 0f;

        for (int i = 0; i < planetAmount; i++)
        {
            //Instantiate planets
            float distance = Random.Range(Settings.MinDistanceBetween, Settings.MaxDistanceBetween) + lastPlanetDistance;
            lastPlanetDistance = distance;

            GameObject planetGameObject = Instantiate(SolarSystemPrefabs.PlanetPrefab,
                                                      star.transform.position + new Vector3(distance * Settings.SizeScale, distance * Settings.SizeScale, 0),
                                                      Quaternion.identity, this.transform);

            Planet planet = planetGameObject.GetComponent <Planet>();

            //set Planet Name
            planet.Name = StarName.Generate(rand);

            //set Planet Size
            float planetSize = Random.Range(Settings.MinPlanetSize, Settings.MaxPlanetSize) * ((distance / 10000) / Settings.SizeScale);
            planet.Size = new Vector3(planetSize, planetSize, planetSize);

            planet.OrbitPeriod = (distance / Settings.SizeScale) * 2;
            _solarSystem.Planets.Add(planet);

            //determine if planet has satellites orbiting it and instantiate them
            bool hasSatellite = Random.Range(Settings.ChanceOfSatellite, 10) <= Settings.ChanceOfSatellite;

            if (hasSatellite)
            {
                int satelliteAmount = Random.Range(Settings.MinSatellites, Settings.MaxPlanets);

                float lastSatelliteDistance = 0f;

                //instantiate satellite
                for (int j = 0; j < satelliteAmount; j++)
                {
                    float distanceToPlanet = (((distance * Settings.SizeScale) + lastSatelliteDistance) + planetSize) / 20;

                    lastSatelliteDistance = distanceToPlanet;

                    GameObject satelliteGameObject = Instantiate(SolarSystemPrefabs.SattelitePrefab,
                                                                 planetGameObject.transform.position + new Vector3(distanceToPlanet, 0, distanceToPlanet),
                                                                 Quaternion.identity, planet.transform);

                    Satellite satellite = satelliteGameObject.GetComponent <Satellite>();
                    satellite.OrbitPeriod = distanceToPlanet * planetSize * 100;
                    satellite.Orbiter     = planet;

                    //set Satellite name
                    satellite.Name = StarName.Generate(rand);

                    float satelliteSize = Random.Range(Settings.MinPlanetSize, Settings.MaxPlanetSize) * ((distanceToPlanet / 1000) / Settings.SizeScale);
                    satellite.Size = new Vector3(satelliteSize, satelliteSize, satelliteSize);

                    planet.Sattelites.Add(satellite);
                }
            }
        }

        _solarSystem.AllignPlanets();
    }