任务
阅读 “Unity制作神奇的粒子海洋!”。
http://www.manew.com/thread-47123-1-1.html
参考 http://i-remember.fr/en 制作类似该网站效果。
效果
网站上的效果如下:
可以看出就是里面一层粒子,和外面一层粒子以不同的速率向相反方向转动,下面为我制作出来的简单效果:
制作过程
新建粒子系统并设置
新建一个粒子系统并且按照以下进行设置:
编写代码
首先创建粒子数组初始化,并且建立一个存储粒子属性的类:
1 public class particleClass
2 {
3 public float radiu = 0.0f;
4 public float angle = 0.0f;
5 public particleClass(float radiu_, float angle_)
6 {
7 radiu = radiu_;
8 angle = angle_;
9 }
10 }
11
12 //创建粒子系统,粒子数组,粒子数目,声明粒子环的半径
13 public ParticleSystem particleSystem;
14 private ParticleSystem.Particle[] particlesArray;
15 private particleClass[] particleAttr; //粒子属性数组
16 public int particleNum = 10000;
17 public float minRadius = 5.0f;
18 public float maxRadius = 10.0f;
19 public int Part = 2;
20 public float speed = 0.1f;
由于需要使得每一个粒子能够产生不同的轨迹,而不是全部在一个圆的边缘线上,因此需要随机产生半径;
同时粒子需要分散在各个部分,因此还需要随机产生角度;
粒子的角度和半径,便决定了它的位置,上面的粒子属性类保存的便是其角度与半径;
但是如果观察仔细可以发现,网站上的粒子系统是粒子中间多,两边少的,也就是有点向中间聚集的,因此使用下面的方式来实现:
1 // 随机产生每个粒子距离中心的半径,同时粒子要集中在平均半径附近
2 float midRadius = (maxRadius + minRadius) / 2;
3 float minRate = Random.Range(1.0f, midRadius / minRadius);
4 float maxRate = Random.Range(midRadius / maxRadius, 1.0f);
5 float randomRadius = Random.Range(minRadius * minRate, maxRadius * maxRate);
然后便是让粒子动起来,这个只需要在Update函数中让粒子分为两部分运动,一部分顺时针一部分逆时针,其中只需要修改粒子的角度即可;
1 void Update()
2 {
3 //设置为两部分的粒子,一部分顺时针,一部分逆时针。
4 for (int i = 0; i < particleNum; i++)
5 {
6 if (i % 2 == 0) particleAttr[i].angle += (i % Part + 1) * speed;
7 else particleAttr[i].angle -= (i % Part + 1) * speed;
8
9 //根据新的角度重新设置位置
10 particleAttr[i].angle = particleAttr[i].angle % 360;
11 float rad = particleAttr[i].angle / 180 * Mathf.PI;
12 particlesArray[i].position = new Vector3(particleAttr[i].radiu * Mathf.Cos(rad), particleAttr[i].radiu * Mathf.Sin(rad), 0f);
13 }
14 particleSystem.SetParticles(particlesArray, particleNum);
15 }
这样,这个粒子系统就完成了,最终效果就出来啦~!还是很酷炫的!
所有代码提供如下:
1 using UnityEngine;
2 using System.Collections;
3
4 public class ParticleRotate : MonoBehaviour
5 {
6 public class particleClass
7 {
8 public float radiu = 0.0f;
9 public float angle = 0.0f;
10 public particleClass(float radiu_, float angle_)
11 {
12 radiu = radiu_;
13 angle = angle_;
14 }
15 }
16
17 //创建粒子系统,粒子数组,粒子数目,声明粒子环的半径
18 public ParticleSystem particleSystem;
19 private ParticleSystem.Particle[] particlesArray;
20 private particleClass[] particleAttr; //粒子属性数组
21 public int particleNum = 10000;
22 public float minRadius = 5.0f;
23 public float maxRadius = 10.0f;
24 public int Part = 2;
25 public float speed = 0.1f;
26
27 void Start()
28 {
29 particleAttr = new particleClass[particleNum];
30 particlesArray = new ParticleSystem.Particle[particleNum];
31 particleSystem.maxParticles = particleNum;
32 particleSystem.Emit(particleNum);
33 particleSystem.GetParticles(particlesArray);
34 for (int i = 0; i < particleNum; i++)
35 { //相应初始化操作,为每个粒子设置半径,角度
36 //产生一个随机角度
37 float randomAngle = Random.Range(0.0f, 360.0f);
38
39 // 随机产生每个粒子距离中心的半径,同时粒子要集中在平均半径附近
40 float midRadius = (maxRadius + minRadius) / 2;
41 float minRate = Random.Range(1.0f, midRadius / minRadius);
42 float maxRate = Random.Range(midRadius / maxRadius, 1.0f);
43 float randomRadius = Random.Range(minRadius * minRate, maxRadius * maxRate);
44
45 //粒子属性设置
46 particleAttr[i] = new particleClass(randomRadius, randomAngle);
47 particlesArray[i].position = new Vector3(randomRadius * Mathf.Cos(randomAngle), randomRadius * Mathf.Sin(randomAngle), 0.0f);
48 }
49 //设置粒子
50 particleSystem.SetParticles(particlesArray, particleNum);
51 }
52
53
54 void Update()
55 {
56 //设置为两部分的粒子,一部分顺时针,一部分逆时针。
57 for (int i = 0; i < particleNum; i++)
58 {
59 if (i % 2 == 0) particleAttr[i].angle += (i % Part + 1) * speed;
60 else particleAttr[i].angle -= (i % Part + 1) * speed;
61
62 //根据新的角度重新设置位置
63 particleAttr[i].angle = particleAttr[i].angle % 360;
64 float rad = particleAttr[i].angle / 180 * Mathf.PI;
65 particlesArray[i].position = new Vector3(particleAttr[i].radiu * Mathf.Cos(rad), particleAttr[i].radiu * Mathf.Sin(rad), 0f);
66 }
67 particleSystem.SetParticles(particlesArray, particleNum);
68 }
69 }
总结
感觉粒子系统能够做出很漂亮的东西啊,真的是增加界面效果,动作效果的神器,第一次打开I Remember的时候真的是被美到了,什么时候自己能够做到这样就好了。