Unity3D學習——粒子光環

本週的作業要求是使用粒子流編程控制製作一些效果,我則是參考以前師兄的成果製作了一個粒子光環效果。

創建新項目,首先在場景菜單中新建一個空對象,命名爲ParticleRing。然後,再爲這個對象增添一個子對象,子對象同樣是一個空對象,命名爲BigRing,給它加一個組件“粒子系統”。
這裏寫圖片描述這裏寫圖片描述
然後在下方資源菜單中,Assets目錄下新建一個文件夾Scripts,在裏面新建C#腳本文件ParticleRing.cs。
這裏寫圖片描述
初始化我們所創建的粒子系統的一些屬性——
這裏寫圖片描述這裏寫圖片描述
然後,把粒子放入場景中,已經可以清楚看到環的形狀。
這裏寫圖片描述這裏寫圖片描述
最後,我們要做的,是讓這個環像小行星帶一樣圍繞圓中心進行圓周運動。在第三週的時候,做太陽系模型時我們學習過一些讓遊戲對象做圓周運動的函數。這裏我們可以使用這些函數,也可以直接用運動學的方法實現。
這裏寫圖片描述
好了,這就是我們最終的效果!
這裏寫圖片描述
注意在C#腳本文件中有一個Mode屬性,這個屬性用來切換粒子效果,我這裏除了順時針旋轉,還做了逆時針旋轉和發散2個模式,以下爲演示。
這裏寫圖片描述
這裏寫圖片描述
最後給出代碼:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ParticleRing : MonoBehaviour {
    public int mode = 0;
    private ParticleSystem particleSys;  // 粒子系統  
    private ParticleSystem.Particle[] particleArr;  // 粒子數組 
    public int count = 10000;       // 粒子數量  
    public float size = 0.03f;      // 粒子大小  
    // Use this for initialization
    void Start () {
        // 初始化粒子數組  
        particleArr = new ParticleSystem.Particle[count];
        //circle = new CirclePosition[count];

        // 初始化粒子系統  
        particleSys = this.GetComponent<ParticleSystem>();
        particleSys.startSpeed = 0;            // 粒子位置由程序控制  
        particleSys.startSize = size;          // 設置粒子大小  
        particleSys.loop = false;
        particleSys.maxParticles = count;      // 設置最大粒子量  
        particleSys.Emit(count);               // 發射粒子  
        particleSys.GetParticles(particleArr);

        RandomlySpread();   // 初始化各粒子位置
    }

// Update is called once per frame
void Update () {
    for(int i = 0; i < count; i++)
    {
        //求得粒子所對應方向的單位向量
        Vector3 v = particleArr[i].position;
        v -= this.transform.position;
        float mod = v.magnitude;
        v /= mod;
        //逆時針
        if(mode == 0)v = new Vector3(-v.y, v.x, v.z);
        //順時針
        else if(mode == 1) v = new Vector3(v.y, -v.x, v.z);
        //隨機速度
        float speed = Random.Range(1f, 5f);
        Vector3 pos = particleArr[i].position + v * speed * Time.deltaTime;
        //發散
        if (pos.magnitude > mod && mode != 2)
        {
            pos *= mod / pos.magnitude;
        }
        particleArr[i].position = pos;
    }
    particleSys.SetParticles(particleArr, particleArr.Length);
}

void RandomlySpread()
{
    int length = particleArr.Length;
    for(int i = 0; i < length; i++)
    {
        //設置平均半徑爲10,範圍在8到12之間
        float r = Random.Range(8f, 12f);
        if (i % 3 == 1) r = Random.Range(9f, 11f);
        if (i % 3 == 2) r = Random.Range(9.5f, 10.5f);
        //隨機生成弧度角,範圍爲0到2π
        float angle = Random.Range(0, 2 * Mathf.PI);
        float x = Mathf.Cos(angle) * r;
        float y = Mathf.Sin(angle) * r;
        //初始化粒子座標,注意要轉成世界座標
        particleArr[i].position = new Vector3(this.transform.position.x + x, this.transform.position.y + y, this.transform.position.z);
    }
    particleSys.SetParticles(particleArr, particleArr.Length);
}
}

參考內容:https://blog.csdn.net/zzj051319/article/details/70891472
Github傳送門:https://github.com/Kuihan/homework7

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章