粒子光环制作
项目地址 本次实验是使用粒子流编程控制制作一些效果,如粒子光环;最终实现的效果如图:粒子为一个环状,平均半径附近的粒子比较聚集,所有粒子分为两大部分,分别逆时针或者顺时针运动,粒子的移动速度一共有十个等级,每个粒子处于一个等级中;光环会逐渐变色。
下面开始着手制作:
1:设置粒子系统:
1:新建空对象,然后Component->Effects->Particle System添加粒子系统:
2:在GameObject的Inspector界面进行相应的设置。主要根据需要更改如下几项:
Start Speed :0
Start Size 0.15-0.25
Render Material :
2:编写脚本代码:
ParticleController.cs
1:记录每个粒子的半径和角度信息类。
public class ParticleData
{
public float radiu; //半径
public float angle; //角度
public ParticleData(float r, float a)
{
radiu = r;
angle = a;
}
}
2:控制类的成员变量:
//需要实现的光环粒子流系统
public ParticleSystem ParticleSystem;
//粒子数组
public ParticleSystem.Particle[] ParticleArr;
//记录粒子信息的数组
private ParticleData[] datas;
//粒子数量
private int ParticleNum = 10000;
//最大最小半径
public float minRadiu = 6.0f;
public float maxRadiu = 10.0f;
//最大最小基础速度
public float minSpeed = 0.004f;
public float maxSpeed = 0.008f;
//共有十个速度等级,真实速度为等级乘以基础速度
public int speedRate = 10;
//渐变颜色
public Gradient colorGradient;
3:系统初始化:粒子的半径和角度是随机的,即随机放置粒子:
// Start is called before the first frame update
void Start()
{
//初始化系统和粒子数组
datas = new ParticleData[ParticleNum];
ParticleArr = new ParticleSystem.Particle[ParticleNum];
ParticleSystem.maxParticles = ParticleNum;
//发射ParticleNum数量的粒子
ParticleSystem.Emit(ParticleNum);
ParticleSystem.GetParticles(ParticleArr);
//初始化粒子的位置,随机,
for(int i = 0 ; i < ParticleNum; ++i )
{
float t_angle = Random.Range(0f,360f);
//随机半径,但是在平均半径附近的概率比较大
float t_radiu = Random.Range(Random.Range(minRadiu,(maxRadiu+minRadiu)/2) , Random.Range((maxRadiu+minRadiu)/2,maxRadiu));
datas[i] = new ParticleData(t_radiu,t_angle);
ParticleArr[i].position = new Vector3(t_radiu*Mathf.Cos(t_angle),t_radiu*Mathf.Sin(t_angle),0f);
}
//设置系统
ParticleSystem.SetParticles(ParticleArr,ParticleNum);
}
4:改变粒子颜色函数:颜色是随着时间和角度改变的:
void ChangeColor(){
float colorValue;
float sheet = 0f;
//根据时间和角度改变颜色
for(int i = 0 ; i < ParticleNum; ++i)
{
//游戏运行时间,每四秒为一个周期
colorValue = (Time.realtimeSinceStartup/4 - Mathf.Floor(Time.realtimeSinceStartup/4));
colorValue += datas[i].angle/360;
//得到一个0-1之间的数:
while (colorValue > 1)
colorValue--;
ParticleArr[i].color = colorGradient.Evaluate(colorValue);
}
}
5:Update :每次都改变颜色和位置,
// Update is called once per frame
void Update()
{
//在每帧刷新时,都按着了逆时针或者顺时针改变粒子位置
for (int i = 0 ; i < ParticleNum; i++){
//该粒子的移动速度,
float t_speed = Random.Range(minSpeed,maxSpeed)*(i%speedRate);
//该次运动半径的细微变化
float t_sway = Random.Range(0.995f,1.005f);
//t_sway = 1f;
if(i % 2 == 0){//顺时针
datas[i].angle += t_speed;
}
else
{
datas[i].angle -= t_speed;
}
datas[i].angle = datas[i].angle % 360;
float rad = datas[i].angle / 180 * Mathf.PI;
ParticleArr[i].position = new Vector3(t_sway*datas[i].radiu*Mathf.Cos(rad),t_sway*datas[i].radiu*Mathf.Sin(rad),0f);
}
//改变颜色
ChangeColor();
ParticleSystem.SetParticles(ParticleArr,ParticleNum);
}
3:设置Gradient颜色:
另外还需要将粒子系统添加到脚本变量上:
点击Color Gradient 设置颜色,
4:最终效果:
bandicam 2020-12-01 09-36-50-934