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); }
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); }