本週的作業要求是使用粒子流編程控制製作一些效果,我則是參考以前師兄的成果製作了一個粒子光環效果。
創建新項目,首先在場景菜單中新建一個空對象,命名爲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