粒子光环制作

项目地址 本次实验是使用粒子流编程控制制作一些效果,如粒子光环;最终实现的效果如图:粒子为一个环状,平均半径附近的粒子比较聚集,所有粒子分为两大部分,分别逆时针或者顺时针运动,粒子的移动速度一共有十个等级,每个粒子处于一个等级中;光环会逐渐变色。

unity粒子路径动画 unity粒子怎么做_unity粒子路径动画

下面开始着手制作:

1:设置粒子系统:

1:新建空对象,然后Component->Effects->Particle System添加粒子系统:

unity粒子路径动画 unity粒子怎么做_初始化_02


2:在GameObject的Inspector界面进行相应的设置。主要根据需要更改如下几项:

Start Speed :0

Start Size 0.15-0.25

Render Material :

unity粒子路径动画 unity粒子怎么做_粒子系统_03

unity粒子路径动画 unity粒子怎么做_改变颜色_04

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 设置颜色,

unity粒子路径动画 unity粒子怎么做_初始化_05

4:最终效果:


bandicam 2020-12-01 09-36-50-934