利用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);
}
}