Unity3d-制作粒子光环特效

利用Unity3d制作一个特效,与这个网站效果类似:


首先,在Unuty3d下面建立了一个object,命名为Particle。

然后建立一个脚本:并挂在刚刚建立的gameobject下面

然后然后依次点击Components->Effects->Particle System添加Particle System组件。

设置变量:


粒子的初速度设为0,并把emission Rate设为0,让粒子有不同的大小,因此设置粒子的初始大小在0.05-0.15之间随机产生


新建C#脚本:

using UnityEngine;
using System.Collections;

public class Particle : MonoBehaviour
{

    public new ParticleSystem particleSystem;
    private ParticleSystem.Particle[] particlesArray;
    public int particleNumber = 400;
    public float radius = 8.0f;

    void Start()
    {
        particlesArray = new ParticleSystem.Particle[particleNumber];//将储存粒子的数组初始化
        particleSystem.maxParticles = particleNumber;//设置粒子发射的最大数量

        particleSystem.Emit(particleNumber);//将刚刚初始化的particleNumber个粒子发射出去
        particleSystem.GetParticles(particlesArray);
        for (int i = 0; i < particleNumber; i++) {//为每个粒子设置其位置
            float angle = Random.Range(0.0f, 360.0f);//位置为0 - 360度的随机一个角度
            particlesArray[i].position = new Vector3(radius * Mathf.Cos(angle), radius * Mathf.Sin(angle), 0.0f);//为每个粒子坐标赋值
        }
        particleSystem.SetParticles(particlesArray, particlesArray.Length);//设置该粒子系统的粒子。前面数组的长度是设置粒子的数量
    }

}
效果如图:



下面将粒子分散到环形区域,为每个粒子的半径设置一个随机的值,修改for循环:

float r = Random.Range(radius, 12.0f);
float angle = Random.Range(0.0f, 360.0f);//位置为0 - 360度的随机一个角度
particlesArray[i].position = new Vector3(r * Mathf.Cos(angle), r * Mathf.Sin(angle), 0.0f);//为每个粒子坐标赋值
效果如下


接下来让粒子能旋转运动起来:

using UnityEngine;
using System.Collections;

public class Particle : MonoBehaviour
{

    public new ParticleSystem particleSystem;
    private ParticleSystem.Particle[] particlesArray;
    public int particleNumber = 400;
    public float radius = 8.0f;
    public float[] particleAngle;
    public float[] particleRadius;

    public float speed = 0.01f;
    void Start()
    {
        particlesArray = new ParticleSystem.Particle[particleNumber];//将储存粒子的数组初始化
        particleSystem.maxParticles = particleNumber;//设置粒子发射的最大数量
        particleAngle = new float[particleNumber];
        particleRadius = new float[particleNumber];

        particleSystem.Emit(particleNumber);//将刚刚初始化的particleNumber个粒子发射出去
        particleSystem.GetParticles(particlesArray);
        for (int i = 0; i < particleNumber; i++) {//为每个粒子设置其位置
            float r = Random.Range(radius, 12.0f);
            float angle = Random.Range(0.0f, 360.0f);//位置为0 - 360度的随机一个角度
            float rad = angle / 180 * Mathf.PI;//角度变换成弧度
            particleAngle[i] = angle;
            particleRadius[i] = r;
            particlesArray[i].position = new Vector3(r * Mathf.Cos(rad), r * Mathf.Sin(rad), 0.0f);//为每个粒子坐标赋值
        }
        particleSystem.SetParticles(particlesArray, particlesArray.Length);//设置该粒子系统的粒子。前面数组的长度是设置粒子的数量
    }
    void Update()
    {
        for (int i = 0; i < particleNumber; i++) {
            //设置速度为五个不同的档次
            if (i%2 == 0) {
                particleAngle[i] += speed*(i%5+1);
            } else {
                particleAngle[i] -= speed*(i%5+1);
            }
            if (particleAngle[i] > 360)
                particleAngle[i] -= 360;
            if (particleAngle[i] < 0)
                particleAngle[i] += 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);
        Debug.Log("111");
    }

}



后面调整粒子的分布,让粒子的分布变成中心多,边缘少的格局:

添加下列代码

//最小半径随机扩大
float rate1 = Random.Range(1.0f, midR / radius);
            //最大半径随机缩小
float rate2 = Random.Range(midR / maxR, 1.0f);
float r = Random.Range(radius * rate1, maxR * rate2);


效果:


下面我们设置一下,让粒子在一定的半径范围内随机游动

public float free = 0.05f;//设置游动的范围
 particleRadius[i] += Mathf.PingPong(time, free) - free / 2.0f;
            time += Time.deltaTime; 

效果



完整代码:

using UnityEngine;
using System.Collections;




public class Particle : MonoBehaviour
{

    public ParticleSystem particleSystem;
    private ParticleSystem.Particle[] particlesArray;
    public int particleNumber = 4000;
    public float radius = 4.0f;
    public float[] particleAngle;
    public float[] particleRadius;
    public float maxR = 10f;
    public float speed = 0.05f;
    float time = 0;
    public float free = 0.05f;//设置游动的范围
    void Start()
    {
        particleSystem = GetComponent<ParticleSystem>();
        particlesArray = new ParticleSystem.Particle[particleNumber];//将储存粒子的数组初始化
        particleSystem.maxParticles = particleNumber;//设置粒子发射的最大数量
        particleAngle = new float[particleNumber];
        particleRadius = new float[particleNumber];

        particleSystem.Emit(particleNumber);//将刚刚初始化的particleNumber个粒子发射出去
        particleSystem.GetParticles(particlesArray);
        for (int i = 0; i < particleNumber; i++) {//为每个粒子设置其位置
            float angle = Random.Range(0.0f, 360.0f);//位置为0 - 360度的随机一个角度
            float rad = angle / 180 * Mathf.PI;//角度变换成弧度
            float midR = (maxR + radius) / 2;
            //最小半径随机扩大
            float rate1 = Random.Range(1.0f, midR / radius);
            //最大半径随机缩小
            float rate2 = Random.Range(midR / maxR, 1.0f);
            float r = Random.Range(radius * rate1, maxR * rate2);

            particleAngle[i] = angle;
            particleRadius[i] = r;
            particlesArray[i].position = new Vector3(r * Mathf.Cos(rad), r * Mathf.Sin(rad), 0.0f);//为每个粒子坐标赋值
        }
        particleSystem.SetParticles(particlesArray, particlesArray.Length);//设置该粒子系统的粒子。前面数组的长度是设置粒子的数量
    }
    void Update()
    {
        for (int i = 0; i < particleNumber; i++) {
            //设置速度为十个不同的档次
            if (i%2 == 0) {
                particleAngle[i] += speed*(i%5+1);
            } else {
                particleAngle[i] -= speed*(i%5+1);
            }
            if (particleAngle[i] > 360)
                particleAngle[i] -= 360;
            if (particleAngle[i] < 0)
                particleAngle[i] += 360;
            particleRadius[i] += (Mathf.PingPong(time, free) - free/2.0f);
            time += Time.deltaTime;
            time %= 100;
            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);
    }

}



  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值