粒子圓圈效果

根據網址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; 同時實現順時針和逆時針兩個方向上的旋轉。

當然這些只是簡單的效果,還有更多可以挖掘的炫酷特效,比如顏色、亮度的變化,運功軌跡的變化等等

發佈了37 篇原創文章 · 獲贊 121 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章