粒子系統是模擬一些不確定、流動現象的技術。它採用許多形狀簡單且賦予生命的微小粒子作爲基本元素來表示物體(一般由點或很小的多邊形通過紋理貼圖表示),表達物體的總體形態和特徵的動態變化。人們經常使用粒子系統模擬的現象有火、爆炸、煙、水流、火花、落葉、雲、霧、雪、塵、流星尾跡或者象發光軌跡這樣的抽象視覺效果等等。
創建粒子光環
參考 http://i-remember.fr/en ,使用粒子流編程控制製作一些效果, 如“粒子光環”
- 創建粒子系統
新建一個空對象並命名爲ParticleCycle,修改Particle System組件的屬性如下:
- 創建 ParticleCycle腳本,在其中設置Particle System的基礎狀態:
public ParticleSystem particleSystem;
private ParticleSystem.Particle[] particlesArray;
public int seaResolution = 50;
void Start()
{
int number = seaResolution * seaResolution;
particlesArray = new ParticleSystem.Particle[number];
GetParticles();
var main = particleSystem.main;
main.maxParticles = seaResolution * seaResolution;
particleSystem.Emit(seaResolution * seaResolution);
particleSystem.GetParticles(particlesArray);
}
- 爲粒子添加極座標位置屬性
private float[] motion;
private float[] radiuses;
粒子的其他屬性:
void GetParticles()
{
for (int i = 0; i < seaResolution; i++)
{
for (int j = 0; j < seaResolution; j++)
{
float radius = Random.Range(minRadius, maxRadius);
float zPos = Mathf.PerlinNoise(i * noiseScale, j * noiseScale) * heightScale;
float athta = Random.Range(0.0f, 360.0f) / 180f * Mathf.PI;
int k = i * seaResolution + j;
athtas[k] = motion;
radiuses[k] = radius;
particlesArray[k].color = colorGradient.Evaluate(zPos);
particlesArray[k].position = new Vector3(radius * Mathf.Cos(motion),radius * Mathf.Sin(motion),zPos);
}
}
}
- 實現粒子的循環擴散動作:
void Update()
{
for (int i = 0; i < seaResolution; i++)
{
for (int j = 0; j < seaResolution; j++)
{
int k = i * seaResolution + j;
float zPos = Mathf.PerlinNoise(i * noiseScale + perlinNoiseAnimX, j * noiseScale + perlinNoiseAnimY) * heightScale;
motion[k] += 0.1f * Mathf.PI * Time.deltaTime;
motion[k] = athtas[k] > 2 * Mathf.PI ? athtas[k] - 2 * Mathf.PI : motion[k];
particlesArray[k].position = new Vector3(radiuses[k] * Mathf.Cos(motion[k]),radiuses[k] * Mathf.Sin(motion[k]),zPos);
}
}
perlinNoiseAnimX += 0.01f;
perlinNoiseAnimY += 0.01f;
particleSystem.SetParticles(particlesArray, particlesArray.Length);
}
- 聲明Gradient類,用來設置粒子的顏色
public Gradient colorGradient;
particlesArray[k].color = colorGradient.Evaluate(zPos);
項目傳送門