3D游戏第八次作业
一、简单粒子制作
- 按参考资源要求,制作一个粒子系统,参考资源
- 使用 3.3 节介绍,用代码控制使之在不同场景下效果不一样
1. 模拟烟花发射
效果展示:
实现:
给空对象挂载一个名为moveup的粒子系统模拟烟花发射
Emission控制粒子上升
设置Size over Lifetime上升过程中闪光
2. 模拟爆炸
效果展示 :
实现:
在一个对象上挂载一个粒子系统名为explosion,将形状设置为Sphere,然后设置Radius设置为0.01,Radius Thickness设置为0
设置Size over Lifetime模拟爆炸后效果,开始显示颜色后颜色逐渐变浅直至消失
3. 粒子光环
效果展示:
实现:
添加粒子系统
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;
private Color[] changeColor = { new Color(255, 255, 255), new Color(255, 0, 0), new Color(255, 255, 0), new Color(0, 255, 0), new Color(0, 0, 255) };
private float colorTimeOut = 0;
对粒子系统进行初始化位置:
void Start()
{
particleSystem = GetComponent<ParticleSystem>();
particlesArray = new ParticleSystem.Particle[particleNumber];
particleSystem.maxParticles = particleNumber;
particleAngle = new float[particleNumber];
particleRadius = new float[particleNumber];
particleSystem.Emit(particleNumber);
particleSystem.GetParticles(particlesArray);
init();
particleSystem.SetParticles(particlesArray, particlesArray.Length);
}
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的 colorTimeOut中都定义了一个循环。首先粒子会不断扩大,当粒子扩大到设置的相应的阈值后就会缩小,并且缩小的速度会大于放大的速度
void Update()
{
//每一个colorTimeOut实现一次缩放
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);
}