public BodyDeposits(GeneratorConfiguration resource, ConfigNode node)
            {
                if (node == null) { node = new ConfigNode(); }

                this.deposits = new List<Deposit>();
                this.seed = Misc.Parse(node.GetValue("Seed"), seedGenerator.Next());

                var random = new System.Random(seed);

                for (int i = 0; i < resource.DepositCount; i++)
                {
                    float R = random.Range(resource.MinRadius, resource.MaxRadius);
                    for (int j = 0; j < resource.NumberOfTries; j++)
                    {
                        Vector2 Pos = new Vector2(random.Range(R, 360 - R), random.Range(R, 180 - R));
                        var deposit = Deposit.Generate(Pos, R, random, resource);
                        if (!deposits.Any(d => d.Shape.Vertices.Any(v => deposit.Shape.PointInPolygon(new Vector2(v.x, v.y)))) && !deposit.Shape.Vertices.Any(v => deposits.Any(d => d.Shape.PointInPolygon(new Vector2(v.x, v.y)))))
                        {
                            deposits.Add(deposit);
                            break;
                        }
                    }
                }

                var depositValues = node.GetValues("Deposit");
                for (int i = 0; i < Math.Min(deposits.Count, depositValues.Length); i++)
                {
                    deposits[i].Quantity = Misc.Parse(depositValues[i], deposits[i].InitialQuantity);
                }

                MaxQuantity = resource.MaxQuantity;
            }
Пример #2
0
    public static Vector3 onUnitSphere(this System.Random gen)
    {
        float lon = gen.Range(0, 2.0f * Mathf.PI);
        float lat = gen.Range(-Mathf.PI, Mathf.PI);
        float c   = Mathf.Cos(lat);

        return(new Vector3(c * Mathf.Cos(lon), Mathf.Sin(lat), c * Mathf.Sin(lon)));
    }
    public override void GetTransform(PropSocket socket, DungeonModel model, Matrix4x4 propTransform, System.Random random, out Vector3 outPosition, out Quaternion outRotation, out Vector3 outScale)
    {
        base.GetTransform(socket, model, propTransform, random, out outPosition, out outRotation, out outScale);

        var rx = random.Range(-maxAngle, maxAngle);
        var ry = random.Range(-maxAngle, maxAngle);
        var rz = random.Range(-maxAngle, maxAngle);

        outRotation = Quaternion.Euler(rx, ry, rz);
    }
Пример #4
0
    public override void GetTransform(PropSocket socket, DungeonModel model, Matrix4x4 propTransform, System.Random random, out Vector3 outPosition, out Quaternion outRotation, out Vector3 outScale)
    {
        var halfWidth = tileWidth / 2.0f;

        outPosition = new Vector3(
            random.Range(-halfWidth, halfWidth), 0,
            random.Range(-halfWidth, halfWidth));

        outRotation = Quaternion.Euler(0, random.Range(0, 360), 0);
        outScale    = Vector3.one;
    }
Пример #5
0
            public BodyDeposits(GeneratorConfiguration resource, ConfigNode node)
            {
                if (node == null)
                {
                    node = new ConfigNode();
                }

                this.deposits = new List <Deposit>();
                this.seed     = Misc.Parse(node.GetValue("Seed"), seedGenerator.Next());

                var random = new System.Random(seed);

                for (int i = 0; i < resource.DepositCount; i++)
                {
                    float R = random.Range(resource.MinRadius, resource.MaxRadius);
                    for (int j = 0; j < resource.NumberOfTries; j++)
                    {
                        Vector2 Pos     = new Vector2(random.Range(R, 360 - R), random.Range(R, 180 - R));
                        var     deposit = Deposit.Generate(Pos, R, random, resource);
                        if (!deposits.Any(d => d.Shape.Vertices.Any(v => deposit.Shape.PointInPolygon(new Vector2(v.x, v.y)))) && !deposit.Shape.Vertices.Any(v => deposits.Any(d => d.Shape.PointInPolygon(new Vector2(v.x, v.y)))))
                        {
                            deposits.Add(deposit);
                            break;
                        }
                    }
                }

                if (resource.CanReplenish)
                {
                    // generated separately to allow updating older saves without messing with their deposites due to changes in the RNG sequence.
                    for (int i = 0; i < deposits.Count; i++)
                    {
                        // MinHalfLife and MaxHalfLife are specified in hours
                        double halflife = 3600 * random.Range(resource.MinHalfLife, resource.MaxHalfLife);
                        deposits[i].Lambda = Math.Log(2) / halflife;
                    }
                }

                var depositValues = node.GetValues("Deposit");

                for (int i = 0; i < Math.Min(deposits.Count, depositValues.Length); i++)
                {
                    var split = depositValues[i].Split(new [] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    deposits[i].Quantity = Misc.Parse(split[0], deposits[i].InitialQuantity);
                    if (split.Length >= 2 && resource.CanReplenish)
                    {
                        deposits[i].LastUT = Misc.Parse(split[1], deposits[i].LastUT);
                    }
                }

                MaxQuantity  = resource.MaxQuantity;
                CanReplenish = resource.CanReplenish;
            }
Пример #6
0
    IEnumerator Start()
    {
        yield return(new WaitForSeconds(0.1f));

        switchTimer = rndGen.Range(minTime, maxTime);
        if (startBehaviour)
        {
            current         = startBehaviour;
            current.enabled = true;
            current.Restart(rndGen.Next(), switchTimer * 0.75f);
        }
    }
Пример #7
0
    public override void GetTransform(PropSocket socket, DungeonModel model, Matrix4x4 propTransform, System.Random random, out Vector3 outPosition, out Quaternion outRotation, out Vector3 outScale)
    {
        base.GetTransform(socket, model, propTransform, random, out outPosition, out outRotation, out outScale);

        var angle    = random.Range(0.0f, Mathf.PI * 2);
        var rotation = Quaternion.Euler(0, angle, 0);

        outRotation = rotation;

        float cellSize     = 20;
        float halfCellSize = cellSize / 2.0f;

        outPosition.x = random.Range(-halfCellSize, halfCellSize);
        outPosition.z = random.Range(-halfCellSize, halfCellSize);
    }
        private static Vector2[] GenerateStarSystemsPositions(Int32 count, Single multiplier)
        {
            Assert.IsTrue(count > 4);

            var positions = new Vector2[count];

            Int32 horizontalCount = (Int32)Mathf.Sqrt(count);

            for (Int32 i = 0; i < count; i++)
            {
                // ReSharper disable once PossibleLossOfFraction
                positions[i] = new Vector2(i % horizontalCount, i / horizontalCount);

                for (Int32 rndOffsetCount = 2; rndOffsetCount <= 6; rndOffsetCount++)
                {
                    positions[i] += new Vector2(Random.Range(-1f, 1f), Random.Range(-0.6f, 0.6f)) / rndOffsetCount;
                }
            }

            Single minX = positions.Select(p => p.x).Min();
            Single minY = positions.Select(p => p.y).Min();

            Single deltaX = minX < 0 ? -minX : 0;
            Single deltaY = minY < 0 ? -minY : 0;

            for (Int32 i = 0; i < positions.Length; i++)
            {
                positions[i] += new Vector2(deltaX, deltaY);
                positions[i] *= multiplier;
            }

            return(positions);
        }
Пример #9
0
    void MakeRandom(int seed)
    {
        var psoRender = randomPreset.GetComponent <PSORender>();

        var rnd = new System.Random(seed);

        randomPreset.seed = (int)DateTime.UtcNow.Ticks;

        int p = rnd.Range(0, 100);

        if (p < 50)
        {
            randomPreset.problem = PSOConfig.Problem.PerlinLandscape;

            randomPreset.perlinOctaves            = rnd.Range(4, 10);
            randomPreset.perlinAmplitude          = rnd.Range(15.0f, 25.0f);
            randomPreset.perlinFrequency.x        = rnd.Range(0.02f, 0.1f);
            randomPreset.perlinFrequency.y        = randomPreset.perlinFrequency.x * rnd.Gaussian(1.0f, 0.1f);
            randomPreset.perlinAmplitudePerOctave = rnd.Gaussian(0.5f, 0.1f);
            randomPreset.perlinFrequencyPerOctave = rnd.Gaussian(2.0f, 0.5f);
            randomPreset.perlinOffset.x           = rnd.Range(-1000.0f, 1000.0f);
            randomPreset.perlinOffset.y           = rnd.Range(-1000.0f, 1000.0f);

            psoRender.materialOverride = materialsLandscape[rnd.Range(0, materialsLandscape.Length)];
            psoRender.yScale           = 1.0f;
        }
        else
        {
            if (p < 75)
            {
                randomPreset.problem = PSOConfig.Problem.ImageSaturation;
            }
            else
            {
                randomPreset.problem = PSOConfig.Problem.ImageValue;
            }

            randomPreset.image       = images[rnd.Range(0, images.Length)];
            randomPreset.invertImage = true;

            psoRender.yScale           = -rnd.Gaussian(20.0f, 4.0f);
            psoRender.materialOverride = materialsImage[rnd.Range(0, materialsImage.Length)];
        }

        psoRender.fogOfFunction = (rnd.Range(0, 100) < 50);
    }
Пример #10
0
    public override void GetTransform(PropSocket socket, DungeonModel model, Matrix4x4 propTransform, System.Random random, out Vector3 outPosition, out Quaternion outRotation, out Vector3 outScale)
    {
        base.GetTransform(socket, model, propTransform, random, out outPosition, out outRotation, out outScale);

        var angle    = random.Range(0, 1) * 90;
        var rotation = Quaternion.Euler(0, angle, 0);

        outRotation = rotation;
    }
Пример #11
0
        public static Deposit Generate(Vector2 Pos, float radius, System.Random random, ResourceDefinition resource)
        {
            var initialQuantity = random.Range(resource.MinQuantity, resource.MaxQuantity);

            var vertices = new List<Vector2>();
            int vertexCount = random.Next(resource.MinVertices, resource.MaxVertices);
            for (int i = 0; i < vertexCount; i++)
            {
                float randomRadius = random.Range(resource.RadiusVariance * radius, radius);
                float angle = 2.0f * (float)Math.PI * ((float)i / (float)vertexCount);
                float x = Pos.x + randomRadius * (float)Math.Cos(angle);
                float z = Pos.y - randomRadius * (float)Math.Sin(angle);

                vertices.Add(new Vector2(x, z));
            }
            var Shape = new Polygon(vertices.ToArray());

            return new Deposit(Shape, initialQuantity, initialQuantity);
        }
Пример #12
0
        public static void Shuffle <T>(T[] Array, System.Random Random)
        {
            int Count = Array.Length;

            for (int i = 0; i < Count; i++)
            {
                int j    = Random.Range(0, Count - 1);
                T   Temp = Array[i];
                Array[i] = Array[j];
                Array[j] = Temp;
            }
        }
Пример #13
0
        /// <summary>
        /// 根据权重列表随机一个对应的项
        /// </summary>
        /// <param name="weightList"></param>
        /// <returns></returns>
        public static int RandomIndexByWeight(int[] weightList, System.Random random)
        {
            if (weightList.Length == 1)
            {
                return(0);
            }

            int totalWeight = 0;

            for (int i = 0; i < weightList.Length; i++)
            {
                if (weightList[i] < 0)
                {
                    return(i);
                }
                else
                {
                    totalWeight += weightList[i];
                }
            }

            int seek = random.Range(1, totalWeight);
            int head = 0;

            for (int i = 0; i < weightList.Length; i++)
            {
                if (seek > head && seek <= head + weightList[i])
                {
                    if (weightList[i] == 0)
                    {
                        if (i == 0)
                        {
                            continue;
                        }
                        else
                        {
                            return(i - 1);
                        }
                    }
                    else
                    {
                        return(i);
                    }
                }
                else
                {
                    head += weightList[i];
                }
            }

            return(-1);
        }
        private static PlanetData GeneratePlanet(StarData starData, Single metallicity, Int32 num)
        {
            String name        = "PLANET" + num;
            Single orbitRadius = Mathf.Sqrt(num + 1) * 50e9f + Random.Range(-3e9f, 3e9f);
            //Корень добавлен для создания эффекта протопланетарного диска с уплотнением в середине
            var    orbitDegree   = new TimeSpan(Random.Next(30, 320), 0, 0, 0);
            Single rotationSpeed = Random.Range(-0.7f, -0.2f);
            Single albedo        = Random.Range(0.05f, 0.7f);
            //Статистика по sol из этой статьи подсказывает: https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D1%8C%D0%B1%D0%B5%D0%B4%D0%BE
            Single temperature = starData.SurfaceTemperature * Mathf.Pow(1.0f - albedo, 0.25f) *
                                 Mathf.Sqrt(starData.Radius / orbitRadius * 2f);

            PlanetType type;
            Single     mass;
            Boolean    solid = Random.Range(0f, 1f) < metallicity;          //Твердая ли планета

            if (solid)
            {
                //Сгенерировать твердую планету
                mass = Random.Range(0.1f, 10f) * Constants.EarthMass;

                if (temperature > 213.0f && temperature <= 340.0f)
                {
                    type = PlanetType.Terra;
                }
                else
                {
                    type = PlanetType.Desert;
                }
            }
            else
            {
                //Сгенерировать газ. гигант
                mass = Random.Range(10f, 1000f) * Constants.EarthMass;
                type = PlanetType.Gas;
            }

            var planetData = new PlanetData
            {
                LocationID    = starData.LocationID,
                ParentStarID  = starData.ID,
                Name          = name,
                Mass          = mass,
                OrbitRadius   = orbitRadius,
                OrbitDegree   = orbitDegree,
                RotationSpeed = rotationSpeed,
                Type          = type,
                Temperature   = temperature
            };

            return(planetData);
        }
    void Start()
    {
        var rndGen1 = new System.Random(seed1);
        var rndGen2 = new System.Random(seed2);

        for (int i = 0; i < 10; i++)
        {
            int r1 = rndGen1.Range(0, 100);
            Debug.Log("R1=" + r1);
            int r2 = rndGen2.Range(0, 100);
            Debug.Log("R2=" + r2);
        }
    }
Пример #16
0
        private List <Deposit> generate(CelestialBody body, ResourceDefinition resource)
        {
            var random = new System.Random(depositSeed ^ (resource.Resource == "Kethane" ? bodySeeds[body.name] : 0) ^ resource.SeedModifier);

            var deposits = new List <Deposit>();

            for (int i = 0; i < resource.DepositCount; i++)
            {
                float R = random.Range(resource.MinRadius, resource.MaxRadius);
                for (int j = 0; j < resource.NumberOfTries; j++)
                {
                    Vector2 Pos     = new Vector2(random.Range(R, 360 - R), random.Range(R, 180 - R));
                    var     deposit = Deposit.Generate(Pos, R, random, resource);
                    if (!deposits.Any(d => d.Shape.Vertices.Any(v => deposit.Shape.PointInPolygon(new Vector2(v.x, v.y)))) && !deposit.Shape.Vertices.Any(v => deposits.Any(d => d.Shape.PointInPolygon(new Vector2(v.x, v.y)))))
                    {
                        deposits.Add(deposit);
                        break;
                    }
                }
            }

            return(deposits);
        }
Пример #17
0
            public BodyDeposits(GeneratorConfiguration resource, ConfigNode node)
            {
                if (node == null)
                {
                    node = new ConfigNode();
                }

                this.deposits = new List <Deposit>();
                this.seed     = Misc.Parse(node.GetValue("Seed"), seedGenerator.Next());

                var random = new System.Random(seed);

                for (int i = 0; i < resource.DepositCount; i++)
                {
                    float R = random.Range(resource.MinRadius, resource.MaxRadius);
                    for (int j = 0; j < resource.NumberOfTries; j++)
                    {
                        Vector2 Pos     = new Vector2(random.Range(R, 360 - R), random.Range(R, 180 - R));
                        var     deposit = Deposit.Generate(Pos, R, random, resource);
                        if (!deposits.Any(d => d.Shape.Vertices.Any(v => deposit.Shape.PointInPolygon(new Vector2(v.x, v.y)))) && !deposit.Shape.Vertices.Any(v => deposits.Any(d => d.Shape.PointInPolygon(new Vector2(v.x, v.y)))))
                        {
                            deposits.Add(deposit);
                            break;
                        }
                    }
                }

                var depositValues = node.GetValues("Deposit");

                for (int i = 0; i < Math.Min(deposits.Count, depositValues.Length); i++)
                {
                    deposits[i].Quantity = Misc.Parse(depositValues[i], deposits[i].InitialQuantity);
                }

                MaxQuantity = resource.MaxQuantity;
            }
        private static StarData GenerateStar(StarSystemData starSystemData)
        {
            //Пока генерируем только главную последовательность
            Single mass        = Mathf.Pow(Random.Range(0.54f, 1.3f), 2f) * Constants.SolMass;
            var    type        = StarType.Yellow;
            Single surfaceTemp = -1f;
            {
                if (mass >= 0.3 * Constants.SolMass && mass <= 0.8 * Constants.SolMass)                 //M, красный карлик
                {
                    type        = StarType.Red;
                    surfaceTemp = Random.Range(2000f, 5000f);
                }
                else if (mass > 0.8 * Constants.SolMass && mass <= 1.7 * Constants.SolMass)                 //Типа солнца
                {
                    type        = StarType.Yellow;
                    surfaceTemp = Random.Range(3500f, 7500f);
                }
                else if (mass > 1.7 * Constants.SolMass && mass <= 18 * Constants.SolMass)                 //Белая или полуголубая звезда
                {
                    type        = StarType.White;
                    surfaceTemp = Random.Range(6000f, 30000f);
                }
                else if (mass > 18 * Constants.SolMass)                 //Почти гигант, голубая звезда
                {
                    type        = StarType.Blue;
                    surfaceTemp = Random.Range(10000f, 60000f);
                }
            }

            String name = type + " starData";

            Single luminosity = Mathf.Pow(mass / Constants.SolMass, 3.9f) * Constants.SolLuminosity;

            Single radius = Mathf.Sqrt(luminosity) * Constants.SolRadius * (Constants.SolTemperature * Constants.SolTemperature)
                            / (surfaceTemp * surfaceTemp * Mathf.Sqrt(Constants.SolLuminosity));                                      //L=(R^2)*(T^4)

            return(new StarData
            {
                LocationID = starSystemData.ID,
                Mass = mass,
                Name = name,
                Type = type,
                Radius = radius,
                SurfaceTemperature = surfaceTemp,
                Luminosity = luminosity
            });
        }
Пример #19
0
 /// <summary>
 /// 在数组中随机一个元素
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="list"></param>
 /// <returns></returns>
 public static T GetRandomInList <T>(List <T> list, System.Random random)
 {
     if (list != null && list.Count > 0)
     {
         if (list.Count == 1)
         {
             return(list[0]);
         }
         else
         {
             return(list[random.Range(0, list.Count)]);
         }
     }
     else
     {
         return(default(T));
     }
 }
Пример #20
0
 /// <summary>
 /// 获取随机的结果
 /// </summary>
 /// <param name="rate"></param>
 /// <returns></returns>
 public static bool GetRating(float rate, System.Random random = null)
 {
     if (rate >= 1)
     {
         return(true);
     }
     else
     {
         float seek = 0f;
         if (random != null)
         {
             seek = random.Range(0f, -1f);
         }
         else
         {
             seek = UnityEngine.Random.Range(0f, 1f);
         }
         rate = rate > 0 ? rate : -rate;
         return(rate >= seek);
     }
 }
    protected override void FillTexture(Color[] colors)
    {
        var rnd = new System.Random(seed);

        for (int y = 0; y < height; y++)
        {
            for (int x = 0; x < width; x++)
            {
                int index = y * width + x;

                float r;
                if (gaussian)
                {
                    r = Mathf.Clamp01(rnd.Gaussian(mean, stdDev / 0.3f));
                }
                else
                {
                    r = rnd.Range(0.0f, 1.0f);
                }
                colors[index] = new Color(r, r, r, 1);
            }
        }
    }
Пример #22
0
        private static List<Deposit> generate(CelestialBody body, int seed, ResourceDefinition resource)
        {
            var random = new System.Random(depositSeed ^ (resource.Resource == "Kethane" ? bodySeeds[body.name] : 0) ^ resource.SeedModifier);

            var deposits = new List<Deposit>();

            for (int i = 0; i < resource.DepositCount; i++)
            {
                float R = random.Range(resource.MinRadius, resource.MaxRadius);
                for (int j = 0; j < resource.NumberOfTries; j++)
                {
                    Vector2 Pos = new Vector2(random.Range(R, 360 - R), random.Range(R, 180 - R));
                    var deposit = Deposit.Generate(Pos, R, random, resource);
                    if (!deposits.Any(d => d.Shape.Vertices.Any(v => deposit.Shape.PointInPolygon(new Vector2(v.x, v.y)))) && !deposit.Shape.Vertices.Any(v => deposits.Any(d => d.Shape.PointInPolygon(new Vector2(v.x, v.y)))))
                    {
                        deposits.Add(deposit);
                        break;
                    }
                }
            }

            return deposits;
        }
        private static List <SpaceObjectData> GeneratePlanetsSystem(StarData starData)
        {
            Single deltaMass   = Random.Range(0.004f, 0.04f) * Constants.SolMass;
            Single metallicity = Random.Range(0.5f, 0.9f);             //Масса тяжелых элементов (тяжелее гелия) в % от общей массы

            var planets = new List <PlanetData>();
            //Это начальный вариант системы, много планет будет удалено в ходе эволюции
            var asteroidFields = new List <AsteroidFieldData>();

            for (Int32 i = 0; i < MaxPlanetCount && deltaMass > 0; i++)
            {
                planets.Add(GeneratePlanet(starData, metallicity, i));
            }

            for (Int32 iterator = 0; iterator < EvolutionIterationsCount; iterator++) //Эволюция в три приема
            {
                for (Int32 i = 0; i < planets.Count - 1; i++)                         //Идем парами по орбитам
                {
                    if (i < 0)
                    {
                        continue;
                    }
                    //Т.к. мы работаем со списком, то можем удалять элементы, но не забываем уменьшать значение итератора
                    var planet1 = planets[i];
                    var planet2 = planets[i + 1];

                    if (!(Mathf.Abs(planet1.OrbitRadius - planet2.OrbitRadius) < EvolutionRange))
                    {
                        continue;
                    }

                    Single ratio = planet1.Mass / planet2.Mass;

                    if (ratio < 0.1f)
                    {
                        if (Random.Range(0, 2) == 1)
                        {
                            planet2.Mass     += planet1.Mass * Random.Range(0f, 1f);      //Вторая ест первую
                            planet2.RingsMass = 0.01f * planet1.Mass;                     //Будем подбирать
                        }
                        planets.Remove(planet1);
                        i--;
                    }

                    if (ratio <= 10f && ratio >= 0.1f)             //Взаимно поделились на ноль
                    {
                        if (Random.Range(0, 2) == 1 && planet1.Type != PlanetType.Gas && planet2.Type != PlanetType.Gas)
                        {
                            var asteroidField =
                                new AsteroidFieldData
                            {
                                LocationID   = starData.LocationID,
                                ParentStarID = starData.ID,
                                Mass         = planet1.Mass + planet2.Mass,
                                Radius       = (planet1.OrbitRadius + planet2.OrbitRadius) / 2,
                                Name         = "AstFieldFrom(" + planet1.Name + ")(" + planet2.Name + ")"
                            };
                            asteroidFields.Add(asteroidField);
                        }

                        planets.Remove(planet1);
                        planets.Remove(planet2);
                        i -= 2;
                    }

                    if (ratio > 10)
                    {
                        if (Random.Range(0, 2) == 1)
                        {
                            planet1.Mass     += planet2.Mass * Random.Range(0f, 1f);                 //Первая ест вторую
                            planet1.RingsMass = 0.01f * planet2.Mass;
                        }

                        planets.Remove(planet2);
                        i--;
                    }
                }
            }

            for (Int32 i = 0; i < asteroidFields.Count - 1; i++)
            {
                if (Mathf.Abs(asteroidFields[i].Radius - asteroidFields[i + 1].Radius) > AsteroidBeltMergeRange)
                {
                    continue;
                }

                asteroidFields[i].Radius = (asteroidFields[i].Radius + asteroidFields[i + 1].Radius) / 2;
                asteroidFields[i].Mass  += asteroidFields[i + 1].Mass;

                var removingAsteroidField = asteroidFields[i + 1];
                asteroidFields.Remove(removingAsteroidField);
                i--;
            }

            var resultList = new List <SpaceObjectData>();

            resultList.AddRange(planets.ConvertAll(p => (SpaceObjectData)p));
            resultList.AddRange(asteroidFields.ConvertAll(a => (SpaceObjectData)a));

            return(resultList);
        }
Пример #24
0
 public static float Range(this System.Random random, float min, float max)
 {
     return((float)random.Range((double)min, max));
 }
Пример #25
0
 /// <summary>
 /// 获取随机数,不包括max最大值
 /// </summary>
 /// <param name="min"></param>
 /// <param name="max"></param>
 /// <returns></returns>
 public static int GetRandom(int min, int max, System.Random random)
 {
     return(random.Range(min, max - 1));
 }
Пример #26
0
 /// <summary>
 /// 指定した範囲内のランダムな浮動小数点数を返します。
 /// </summary>
 /// <param name="min">返される乱数の包括的下限値。</param>
 /// <param name="max">返される乱数の包括的上限値。</param>
 public static float Range(this Original.Random random, float min, float max)
 {
     return((float)random.Range((double)min, (double)max));
 }
Пример #27
0
 public static float GetRandom(float min, float max, System.Random random)
 {
     return(random.Range(min, max));
 }
Пример #28
0
 public float GetValue(System.Random random)
 {
     return(random.Range(min, max));
 }
Пример #29
0
    override public bool Restart(int seed, float estimatedTime)
    {
        int tries    = 0;
        int maxTries = 25;

        rndGen = new System.Random(seed);

        while (tries < maxTries)
        {
            elapsedTime = 0;

            PSORender psoRender = FindObjectOfType <PSORender>();

            startLookPos = new Vector3(rndGen.Range(-1, 1), rndGen.Range(0.5f, 1.5f), rndGen.Range(-1, 1)).normalized *outerRadius *scale;

            startLookPos.y = Mathf.Max(startLookPos.y, psoRender.extentsY.y);

            PSOParticle particle = null;

            switch (targetParticle)
            {
            case TargetParticle.None:
                targetPos = rndGen.onUnitSphere() * innerRadius * scale;
                if (targetPos.y < 0)
                {
                    targetPos.y = Mathf.Abs(targetPos.y);
                }
                break;

            case TargetParticle.Best:
                particle = psoRender.GetBestParticle();
                break;

            case TargetParticle.Worst:
                particle = psoRender.GetBestParticle();
                break;

            case TargetParticle.Random:
                int index = rndGen.Range(0, psoRender.GetParticleCount());
                particle = psoRender.GetParticle(index);
                break;

            default:
                break;
            }

            transform.position = startLookPos;

            if (particle)
            {
                if (usePrediction)
                {
                    targetPos = particle.Predict(estimatedTime);
                }
                else
                {
                    particleTransform = particle.transform;
                    targetPos         = particleTransform.position;
                }

                Vector3 toTarget = targetPos - startLookPos;
                Vector3 dir      = toTarget.normalized;
                float   maxDist  = toTarget.magnitude;

                if (dir.y < -0.1f)
                {
                    // Check raycast
                    if (!Physics.Raycast(startLookPos, dir, maxDist))
                    {
                        break;
                    }
                }

                tries++;
            }
            else
            {
                Vector3 toTarget = targetPos - startLookPos;
                Vector3 dir      = toTarget.normalized;
                float   maxDist  = toTarget.magnitude;

                if (dir.y < -0.1f)
                {
                    break;
                }
            }
        }

        if (tries == maxTries)
        {
            return(false);
        }

        FixedUpdate();

        return(true);
    }