예제 #1
0
    void Start()
    {
        flag           = -1;
        particleAttr   = new particleClass[particleNum];
        particlesArray = new ParticleSystem.Particle[particleNum];
        //particleSystem.maxParticles = particleNum;
        particleSystem.Emit(particleNum);
        particleSystem.GetParticles(particlesArray);
        for (int i = 0; i < particleNum; i++)
        {
            //相应初始化操作,为每个粒子设置半径,角度
            float randomAngle;

            // 随机产生每个粒子距离中心的半径,同时粒子要集中在平均半径附近
            float maxR, minR;

            if (i < particleNum * 5 / 12)//这部分粒子属于较宽的那个环
            {
                maxR        = outMaxRadius;
                minR        = outMinRadius;
                randomAngle = Random.Range(0.0f, 360.0f);
            }
            else//窄环带缺口,设置一半向0度集中、一半向180度集中,以便在90度和-90度形成两个对称缺口
            {
                maxR = inMaxRadius;
                minR = inMinRadius;
                float minAngle = Random.Range(-90f, 0.0f);
                float maxAngle = Random.Range(0.0f, 90f);
                float angle    = Random.Range(minAngle, maxAngle);

                randomAngle = i % 2 == 0 ? angle : angle - 180;//利用对称性设置另一半粒子
            }

            float midRadius = (maxR + minR) / 2;

            float min = Random.Range(minR, midRadius);

            float max = Random.Range(midRadius, maxR);

            float randomRadius = Random.Range(min, max);

            float collectRadius;

            //注意设置平均半径外围的粒子缩小时移动的距离少一些
            if (randomRadius > midRadius)
            {
                collectRadius = randomRadius - (randomRadius - midRadius) / 2;
            }
            else
            {
                collectRadius = randomRadius - (randomRadius - midRadius) * 3 / 4;
            }

            //粒子属性设置
            particleAttr[i]            = new particleClass(randomRadius, randomAngle, collectRadius);
            particlesArray[i].position = new Vector3(randomRadius * Mathf.Cos(randomAngle), randomRadius * Mathf.Sin(randomAngle), 0.0f);
        }
        //设置粒子
        particleSystem.SetParticles(particlesArray, particleNum);
    }
예제 #2
0
    void Start()
    {
        particleAttr   = new particleClass[particleNum];
        particlesArray = new ParticleSystem.Particle[particleNum];
        particleSystem.maxParticles = particleNum;
        particleSystem.Emit(particleNum);
        particleSystem.GetParticles(particlesArray);
        for (int i = 0; i < particleNum; i++)
        {   //相应初始化操作,为每个粒子设置半径,角度
            //产生一个随机角度
            float randomAngle = Random.Range(0.0f, 360.0f);

            // 随机产生每个粒子距离中心的半径,同时粒子要集中在平均半径附近
            float midRadius    = (maxRadius + minRadius) / 2;
            float minRate      = Random.Range(1.0f, midRadius / minRadius);
            float maxRate      = Random.Range(midRadius / maxRadius, 1.0f);
            float randomRadius = Random.Range(minRadius * minRate, maxRadius * maxRate);

            ////一种待完善的产生随机粒子的办法 box-muller
            //float sita = 2 * Mathf.PI * Random.Range(0, 1);
            //float R = Mathf.Sqrt(-2 * Mathf.Log(0.7f));
            //float Z = R * Mathf.Cos(sita);
            //float randomRadius = (minRadius + maxRadius) / 2 + Z * 2.5f;
            //print(randomRadius);
            //Debug.Log("r = " + R);
            //Debug.Log(randomRadius);

            //粒子属性设置
            particleAttr[i]            = new particleClass(randomRadius, randomAngle);
            particlesArray[i].position = new Vector3(randomRadius * Mathf.Cos(randomAngle), randomRadius * Mathf.Sin(randomAngle), 0.0f);
        }
        //设置粒子
        particleSystem.SetParticles(particlesArray, particleNum);
    }