首先创建一个新对象,在这个对象里新建粒子系统:
新建一个脚本,挂载在上面的对象上。下面是脚本的内容:
首先,是光环的一些属性:
public ParticleSystem particleSystem; //粒子系统对象
public int particleNumber = 5000; //发射的最大粒子数
public float pingPong = 0.05f;
public float size = 0.05f; //粒子的大小
public float maxRadius = 10f; //粒子的旋转半径
public float minRadius = 4.0f;
public float speed = 0.05f; //粒子的运动速度
private float[] particleAngle;
private float[] particleRadius;
private float time = 0;
private ParticleSystem.Particle[] particlesArray;
接下来在init函数中进行初始的设置,将很多粒子排列成一个圆:
void init()
{
//对于每个粒子
for (int i = 0; i < particleNumber; i++)
{
//随机生成角度
float angle = Random.Range(0.0f, 360.0f);
//换回弧度制
float rad = angle / 180 * Mathf.PI;
//设定粒子的旋转半径
float midRadius = (maxRadius + minRadius) / 2;
float rate1 = Random.Range(1.0f, midRadius / minRadius);
float rate2 = Random.Range(midRadius / maxRadius, 1.0f);
float r = Random.Range(minRadius * rate1, maxRadius * rate2);
//设定粒子的大小
particlesArray[i].size = size;
particleAngle[i] = angle;
particleRadius[i] = r;
//放置粒子
particlesArray[i].position = new Vector3(r * Mathf.Cos(rad), r * Mathf.Sin(rad), 0.0f);
}
}
在Update函数中,让粒子按一定的方向和角度进行旋转。为了模拟有两个环,且两个环旋转方向不同这一效果,决定将粒子平分为两类,一类顺时针旋转,一类逆时针旋转:
void Update()
{
colorTimeOut += Time.deltaTime;
for (int i = 0; i < particleNumber; i++)
{
time += Time.deltaTime;
particlesArray[i].color = changeColor[(int)(colorTimeOut % 5)];
particleRadius[i] += (Mathf.PingPong(time / minRadius / maxRadius, pingPong) - pingPong / 2.0f);
if (i % 2 == 0)
{
particleAngle[i] += speed * (i % 10 + 1);
}
else
{
particleAngle[i] -= speed * (i % 10 + 1);
}
particleAngle[i] = (particleAngle[i] + 360) % 360;
float rad = particleAngle[i] / 180 * Mathf.PI;
particlesArray[i].position = new Vector3(particleRadius[i] * Mathf.Cos(rad), particleRadius[i] * Mathf.Sin(rad), 0f);
}
particleSystem.SetParticles(particlesArray, particleNumber);
}
这时的光环比较昏暗,我导入了Glow11插件,就变得清晰多了: