Unity 粒子系统
粒子系统通过生成使大量的2d图像成为动画的形式模拟流体,云,火焰
使用粒子系统生成粒子光环
创建粒子系统和粒子位置数组
新建工程和空场景,然后新建空对象并将它放在原点。这是“光环”的中心。接下来创建一个C#脚本并命名为ParticleCycle 。然后依次点击Components->Effects->Particle System添加Particle System组件。
粒子系统需要修改Duration,Start Lifetime,Start speed,Scaling Mode为下图内容:
然后打开ParticleCycle脚本,输入
public ParticleSystem particleSystem;
private ParticleSystem.Particle[] particlesArray;
public int seaResolution = 50;
void Start()
{
int number = seaResolution * seaResolution;
particlesArray = new ParticleSystem.Particle[number];
//athtas = new float[number];
//radiuses = new float[number];
GetParticles();
var main = particleSystem.main;
main.maxParticles = seaResolution * seaResolution;
particleSystem.Emit(seaResolution * seaResolution);
particleSystem.GetParticles(particlesArray);
}
采用极坐标分配粒子位置
这里需要添加两个属性
private float[] athtas;
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] = athta;
radiuses[k] = radius;
particlesArray[k].color = colorGradient.Evaluate(zPos);
particlesArray[k].position = new Vector3(radius * Mathf.Cos(athta),radius * Mathf.Sin(athta),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;
//particlesArray[k].color = colorGradient.Evaluate(zPos);
athtas[k] += 0.1f * Mathf.PI * Time.deltaTime;
athtas[k] = athtas[k] > 2 * Mathf.PI ? athtas[k] - 2 * Mathf.PI : athtas[k];
particlesArray[k].position = new Vector3(radiuses[k] * Mathf.Cos(athtas[k]),radiuses[k] * Mathf.Sin(athtas[k]),zPos);
}
}
perlinNoiseAnimX += 0.01f;
perlinNoiseAnimY += 0.01f;
particleSystem.SetParticles(particlesArray, particlesArray.Length);
}
颜色
这里,Gradient 类用起来非常方便,只需要再添加一个变量:
public Gradient colorGradient;
Gradient声明后,把脚本拖到空对象上,就可以设置不同颜色了:
然后使用这个语句就可以了
particlesArray[k].color = colorGradient.Evaluate(zPos);
更多内容请参考:传送门