예제 #1
0
 void RandomlySpread()
 {
     // 初始化各粒子位置
     // 随机每个粒子距离中心的半径,同时希望粒子集中在平均半径附近
     for (int i = 0; i < pCount; ++i)
     {
         float midRadius = (maxRadius + minRadius) / 2;
         float minRate   = Random.Range(1.0f, midRadius / minRadius);
         float maxRate   = Random.Range(midRadius / maxRadius, 1.0f);
         float radius    = Random.Range(minRadius * minRate, maxRadius * maxRate);
         // 随机每个粒子的角度
         float angle = Random.Range(0.0f, 360.0f);
         float theta = angle / 180 * Mathf.PI;
         // 随机每个粒子的游离起始时间
         float time = Random.Range(0.0f, 360.0f);
         circle[i] = new CirclePosition(radius, angle, time);
         before[i] = radius;
         after[i]  = 0.7f * radius;
         if (after[i] < minRadius * 1.1f)
         {
             after[i] = Random.Range(Random.Range(minRadius, midRadius), (minRadius * 1.1f));
         }
         particleArr[i].position = new Vector3(circle[i].radius * Mathf.Cos(theta), 0f, circle[i].radius * Mathf.Sin(theta));
     }
     particleSys.SetParticles(particleArr, particleArr.Length);
 }
예제 #2
0
    void Start()
    {
        particlesArray = new ParticleSystem.Particle[count];
        circles        = new CirclePosition[count];
        particleSystem = gameObject.GetComponent <ParticleSystem>();
        particleSystem.maxParticles = count;
        particleSystem.startSize    = size;
        particleSystem.Emit(count);
        particleSystem.GetParticles(particlesArray);
        float midRadius = (maxRadius + minRadius) / 2;
        float minRate   = Random.Range(1.0f, midRadius / minRadius);
        float maxRate   = Random.Range(midRadius / maxRadius, 1.0f);

        for (int i = 0; i < count; i++)
        {
            //设置半径
            float radius = Random.Range(minRadius * minRate, maxRadius * maxRate);
            //设置角度
            float angle = (float)i / count * 360f;

            float theta = angle / 180 * Mathf.PI;
            //保存粒子初位置
            circles[i] = new CirclePosition(radius, angle, (float)i / count * 360f, radius);
            //设置粒子初位置
            particlesArray[i].position = new Vector3(radius * Mathf.Cos(theta), radius * Mathf.Sin(theta), 0);
        }
        particleSystem.SetParticles(particlesArray, particlesArray.Length);
    }
예제 #3
0
    void Start()
    {
        particleAngle = new float[particleNum];
        particleR     = new float[particleNum];
        before        = new float[particleNum];
        after         = new float[particleNum];
        particles     = new ParticleSystem.Particle[particleNum];

        particleSystem.maxParticles = particleNum;
        particleSystem.Emit(particleNum);
        particleSystem.GetParticles(particles);

        CirclePosition cp = new CirclePosition();

        // 每个粒子在初始化的时候都设定好收缩前和收缩后的粒子半径
        for (int i = 0; i < particleNum; i++)
        {
            float r     = (float)cp.getNormalDistribution((minRadius + maxRadius) * 0.5f, 1);
            float angle = UnityEngine.Random.Range(0.0f, 360.0f);
            particleAngle[i] = angle;
            particleR[i]     = r;

            before[i] = r;
            after[i]  = 0.7f * r;

            if (after[i] < minRadius * 1.1f)
            {
                float midRadius = minRadius * 1.05f;
                after[i] = UnityEngine.Random.Range(UnityEngine.Random.Range(minRadius, midRadius), (minRadius * 1.1f));
            }
        }
    }
예제 #4
0
    void RandomlySpread()
    {
        for (int i = 0; i < count; ++i)
        {   // 随机每个粒子距离中心的半径,同时希望粒子集中在平均半径附近
            float midRadius = (maxRadius + minRadius) / 2;
            float minRate   = Random.Range(1.0f, midRadius / minRadius);
            float maxRate   = Random.Range(midRadius / maxRadius, 1.0f);
            float radius    = Random.Range(minRadius * minRate, maxRadius * maxRate);
            // float radius = (float)i / count * 10f;
            // if (radius == 0) radius = 0.0001f;
            // 随机每个粒子的角度
            //float angle = Random.Range(0.0f, 360.0f);
            float angle = (float)i / count * 360.0f;
            //Debug.Log(angle);
            float theta = angle / 180 * Mathf.PI;

            // 随机每个粒子的游离起始时间
            float time = Random.Range(0.0f, 360.0f);

            circle[i] = new CirclePosition(radius, angle, time, radius);

            particleArr[i].position = new Vector3(circle[i].radius * Mathf.Cos(theta), circle[i].radius * Mathf.Sin(theta), 0f);
        }

        particleSys.SetParticles(particleArr, particleArr.Length);
    }
예제 #5
0
    //随机分布
    void RandomlySpread()
    {
        for (int i = 0; i < count; ++i)
        {
            //修改:随机每个粒子距离中心的半径,希望粒子靠近两遍
            float midRadius         = (maxRadius + minRadius) / 2;
            float one_four_Radius   = minRadius + (maxRadius - minRadius) / 4;
            float three_four_Radius = minRadius + (maxRadius - minRadius) * 3 / 4;
            float minRate           = Random.Range(1.0f, one_four_Radius / minRadius);
            float maxRate           = Random.Range(three_four_Radius / maxRadius, 1.0f);
            float radius            = Random.Range(minRadius * minRate, maxRadius * maxRate);

            // 随机每个粒子的角度 ,实现缺口
            float minAngle    = Random.Range(-90f, 0.0f);
            float maxAngle    = Random.Range(0.0f, 90f);
            float randomangle = Random.Range(minAngle, maxAngle);

            float angle = i % 2 == 0 ? randomangle : randomangle - 180;
            // float angle = Random.Range(0.0f, 360.0f);
            float theta = angle / 180 * Mathf.PI;//真正的theta角度



            // 随机每个粒子的游离起始时间
            float time = Random.Range(0.0f, 360.0f);

            circle[i] = new CirclePosition(radius, angle, time);

            particleArr[i].position = new Vector3(circle[i].radius * Mathf.Cos(theta), 0f, circle[i].radius * Mathf.Sin(theta));
            //更新透明度
            //particleArr[i].color = colorGradient.Evaluate(circle[i].angle / 360.0f);
        }

        particleSys.SetParticles(particleArr, particleArr.Length);
    }
예제 #6
0
 void RandomlySpread()
 {
     for (int i = 0; i < count; ++i)
     {
         float minRate = Random.Range(Random.Range(
                                          Random.Range(1.0f, 1.8f), 1.8f), 1.8f);
         float maxRate = Random.Range(0.5f, Random.Range(
                                          0.5f, Random.Range(0.5f, 1.0f)));
         float radius = Random.Range(minradius * minRate, maxradius * maxRate);
         float angle  = Random.Range(0.0f, 360.0f);
         float time   = Random.Range(0.0f, 360.0f);
         circle[i]            = new CirclePosition(radius, angle, time);
         particleArr[i].color = colorGradient.Evaluate(circle[i].angle / 360.0f);
     }
     particles.SetParticles(particleArr, particleArr.Length);
 }
예제 #7
0
    void RandomlySpread()
    {
        for (int i = 0; i < count; ++i)
        {
            // 使用高斯分布生成半径, 均值为midRadius,标准差为0.7
            float midRadius = (maxRadius + minRadius) / 2;
            float radius    = (float)normalGenerator.NextGaussian(midRadius, 0.7);

            float angle        = Random.Range(0.0f, 360.0f);
            float theta        = angle / 180 * Mathf.PI;
            float time         = Random.Range(0.0f, 360.0f);          // 给粒子生成一个随机的初始进度
            float radiusChange = Random.Range(0.0f, maxRadiusChange); // 随机生成一个轨道变化大小
            circle[i] = new CirclePosition(radius, angle, time);
            particleArr[i].position = new Vector3(circle[i].radius * Mathf.Cos(theta), 0f, circle[i].radius * Mathf.Sin(theta));
        }

        particleSys.SetParticles(particleArr, particleArr.Length);
    }
예제 #8
0
    // Use this for initialization
    void Start()
    {   // 初始化粒子数组  
        particleArr = new ParticleSystem.Particle[count];
        circle      = new CirclePosition[count];

        particleSys            = this.GetComponent <ParticleSystem>();
        particleSys.startSpeed = 0;
        particleSys.startSize  = size;           
        particleSys.loop = false;
        particleSys.maxParticles = count;
        particleSys.Emit(count);
        particleSys.GetParticles(particleArr);

        GradientAlphaKey[] alphaKeys = new GradientAlphaKey[5];
        alphaKeys[0].time = 0.0f; alphaKeys[0].alpha = 1.0f;
        alphaKeys[1].time = 0.4f; alphaKeys[1].alpha = 0.4f;
        alphaKeys[2].time = 0.6f; alphaKeys[2].alpha = 1.0f;
        alphaKeys[3].time = 0.9f; alphaKeys[3].alpha = 0.4f;
        alphaKeys[4].time = 1.0f; alphaKeys[4].alpha = 0.9f;
        GradientColorKey[] colorKeys = new GradientColorKey[2];
        colorKeys[0].time = 0.0f; colorKeys[0].color = Color.white;
        colorKeys[1].time = 1.0f; colorKeys[1].color = Color.white;
        colorGradient.SetKeys(colorKeys, alphaKeys);

        for (int i = 0; i < count; ++i)
        {
            float midRadius = (maxRadius + minRadius) / 2;
            float minRate   = Random.Range(1.0f, midRadius / minRadius);
            float maxRate   = Random.Range(midRadius / maxRadius, 1.0f);
            float radius    = Random.Range(minRadius * minRate, maxRadius * maxRate);
            float angle     = Random.Range(0.0f, 360.0f);
            float theta     = angle / 180 * Mathf.PI;
            float time      = Random.Range(0.0f, 360.0f);

            circle[i] = new CirclePosition(radius, angle, time);

            particleArr[i].position = new Vector3(circle[i].radius * Mathf.Cos(theta), 0f, circle[i].radius * Mathf.Sin(theta));
        }

        particleSys.SetParticles(particleArr, particleArr.Length);
    }
예제 #9
0
    void RandomlySpread()
    {
        for (int i = 0; i < count; ++i)
        {
            float midRadius = (maxRadius + minRadius) / 2;
            float minRate   = Random.Range(1.0f, midRadius / minRadius);
            float maxRate   = Random.Range(midRadius / maxRadius, 1.0f);
            float radius    = Random.Range(minRadius * minRate, maxRadius * maxRate);

            float angle = Random.Range(0.0f, 360.0f);
            float theta = angle / 180 * Mathf.PI;

            float time = Random.Range(0.0f, 360.0f);

            circle[i] = new CirclePosition(radius, angle, time);

            particles[i].position = new Vector3(circle[i].radius * Mathf.Cos(theta), 0f, circle[i].radius * Mathf.Sin(theta));
        }

        particleSystem.SetParticles(particles, particles.Length);
    }
예제 #10
0
    void RandomlySpread()
    {
        for (int i = 0; i < count; ++i)
        {   // 随机每个粒子距离中心的半径,同时希望粒子集中在平均半径附近
            float midRadius = (maxRadius + minRadius) / 2;
            float minRate   = Random.Range(1.0f, midRadius / minRadius);
            float maxRate   = Random.Range(midRadius / maxRadius, 1.0f);
            float radius    = Random.Range(minRadius * minRate, maxRadius * maxRate);

            // 随机每个粒子的角度
            float angle = Random.Range(0.0f, 360.0f);
            float theta = angle / 180 * Mathf.PI;

            // 随机每个粒子的游离起始时间
            float time = Random.Range(0.0f, 360.0f);

            cirPosition[i] = new CirclePosition(radius, angle, time);

            parArray[i].position = new Vector3(cirPosition[i].radius * Mathf.Cos(theta), 0f, cirPosition[i].radius * Mathf.Sin(theta));
        }

        parSystem.SetParticles(parArray, parArray.Length);
    }