根據網址http://i-remember.fr/en製作的炫酷效果,現在我們可以利用U3D的粒子系統學着製作一個簡單的白色粒子圓圈效果。
大致思路如下:
一、創建空對象,並掛載粒子系統的組件(Add Component->Effects->Particle System)
二、創建c#腳本,並將其掛載到空對象中,用來控制粒子的運動
具體腳本設計如下:
首先,創建粒子系統與數組:
private ParticleSystem particleSys; // 粒子系統
private ParticleSystem.Particle[] particleArr; // 粒子數組
接着,由於這些粒子都有運動半徑、速度(圍繞圓心運動的角速度)等屬性,所以爲了能有效的管理每個粒子,利用類似於c++中結構體和類的思想定義此處的粒子類,由於粒子都是做圓周運動,所以研究其角速度更爲方便,具體實現如下:
public class Particles
{
public float radius = 0;
public float angle = 0;
public float time = 0;
public Particles(float radius, float angle, float time)
{
this.radius = radius;
this.angle = angle;
this.time = time;
}
定義粒子類之後,就可以設置一些粒子的基本屬性了:
private Particles[] circle; // 極座標數組
public int count = 10000; // 粒子的數目
public float size = 0.03f; // 粒子的大小
public float minRadius = 5; // 粒子轉動的最小半徑
public float maxRadius = 10; // 粒子轉動的最大半徑
public bool clockwise = true; // 判斷粒子轉動方向
public float speed = 3; // 速度
public float pingPong = 0.03f; // 遊離範圍
再接着,就需要將粒子放在我們設定好的圓環內,所以接下來就需要在start函數中進行初始化。
1、初始化粒子系統
particleArr = new ParticleSystem.Particle[count];
circle = new Particles[count];
particleSys = this.GetComponent<ParticleSystem>();
particleSys.startSpeed = 0;
particleSys.startSize = size; // 設置粒子大小
particleSys.maxParticles = count; // 設置最大粒子量
particleSys.Emit(count); // 發射粒子
particleSys.GetParticles(particleArr);
2、初始化粒子的位置
for (int i = 0; i < count; ++i)
{
float angle = Random.Range(0.0f, 360.0f);
float Angle = angle / 180 * Mathf.PI;
float time = Random.Range(0.0f, 360.0f);
// 使粒子集中在平均半徑附近
float mid = (maxRadius + minRadius) / 2;
float minRate = Random.Range(1.0f, mid / minRadius);
float maxRate = Random.Range(mid / maxRadius, 1.0f);
float radius = Random.Range(minRadius * minRate, maxRadius * maxRate);
circle[i] = new Particles(radius, angle, time);
particleArr[i].position = new Vector3(circle[i].radius * Mathf.Cos(Angle), 0f, circle[i].radius * Mathf.Sin(Angle));
}
particleSys.SetParticles(particleArr, particleArr.Length);
上面的步驟已經產生了一個靜態的粒子圓圈效果,而我們的最終任務是讓它們轉動起來,所以,最後還需要實現Update函數,使其每幀都能調用Update函數,達到動態旋轉的目的:
for (int i = 0; i < count; i++)
{
if (i % 2 == 0) clockwise = true; //交替產生順時針和逆時針的轉動
else clockwise = false;
if (clockwise) // 順時針轉
circle[i].angle -= (i % temp + 1) * (speed / circle[i].radius / temp);
else // 逆時針轉
circle[i].angle += (i % temp + 1) * (speed / circle[i].radius / temp);
circle[i].angle = (360.0f + circle[i].angle) % 360.0f;
float Angle = circle[i].angle / 180 * Mathf.PI;
particleArr[i].position = new Vector3(circle[i].radius * Mathf.Cos(Angle), 0f, circle[i].radius * Mathf.Sin(Angle));
}
particleSys.SetParticles(particleArr, particleArr.Length);
}
其中有個小細節就是,爲了達到更好的視覺效果,我們可以讓更靠近中心的速度大一些,但是需要提前設一個能夠區分角速度的量,比如private int temp = 10; 同時實現順時針和逆時針兩個方向上的旋轉。
當然這些只是簡單的效果,還有更多可以挖掘的炫酷特效,比如顏色、亮度的變化,運功軌跡的變化等等