任務
閱讀 “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的時候真的是被美到了,什么時候自己能夠做到這樣就好了。
