Unity3D制作粒子系统

任务

阅读 “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的时候真的是被美到了,什么时候自己能够做到这样就好了。

原文地址:https://www.cnblogs.com/iamxiaoyubei/p/6828744.html