作业要求
本次作业基本要求是三选一。
- 简单粒子制作
- 完善官方的“汽车尾气”模拟
- 使用粒子流编程控制制作一些效果, 如“粒子光环”
在本次作业中,我完成的是作业三——粒子光环。
实现
在项目中新建一个Particle System,修改一下Rotate以便其正对摄像机,Particle System中的相关参数也没有怎么修改:

然后就是通过脚本实现例子移动形成光环的效果了。
实现思路如下:
首先要使用一个数组particleRing来存储所有粒子,然后使用angle数组来存储各个粒子当前的角度(位置)和旋转半径R
private ParticleSystem.Particle[] particleRing;
private float[] particleAngle;
private float[] particleR;
实现旋转的部分如下:
if (i % 2 == 0){
particleAngle[i] += (i % level + 1) * speed;
}
else{
particleAngle[i] -= (i % level + 1) * speed;
}
particleAngle[i] = particleAngle[i] % 360;
float rad = particleAngle[i] / 180 * Mathf.PI;
particleRing[i].position = new Vector3(particleR[i] * Mathf.Cos(rad), particleR[i] * Mathf.Sin(rad), 0f);
这里的i是遍历整个粒子数组的index,前面的一个if判断的效果是让一半粒子顺时针旋转、一半粒子逆时针旋转。
每个粒子的Angle加上或者减去(i % level + 1)*speed,这里的用意是各个粒子的运行速度不完全一致,而是分为level个等级依次递增,然后将计算后的结果%360,为了保证Angle在合法范围[0,360]之间。
接着计算出相应弧度值,因为Mathf中的Cos和Sin函数接收的参数是弧度值。
最后就直接修改每一个粒子的位置,利用数学知识:
x
=
r
c
o
s
θ
x=rcos\theta
x=rcosθ、
y
=
r
s
i
n
θ
y=rsin\theta
y=rsinθ即可。
除此之外,本项目还实现了粒子光环的颜色渐变,利用到的是
public Gradient Color;
在每次update 遍历粒子的时候进行如下操作:
particleRing[i].color = Color.Evaluate(Mathf.Abs(Mathf.Cos(Time.time)));
可以根据时间来在渐变色板上以cos的变化进行取色。
此时效果如下:

基本实现了粒子光环的效果,但是想要进行一些处理,让光环的中间比较厚、两边比较薄一点,显得更加美观,因此在设置粒子半径r的时候增加如下操作:

先取最小半径和最大半径的均值,然后先在进行三次随机,这样粒子落在中间的概率就比落在两边的概率大了。
此时效果如下:

可以看出两边的厚度明显小于中间,粒子光环制作完成。
本文介绍了如何在Unity3D中创建粒子光环特效。通过建立ParticleSystem,调整参数,并编写脚本来控制粒子旋转,使部分粒子顺时针、部分逆时针旋转,形成光环。同时,通过颜色渐变实现粒子颜色随时间变化。为了使光环中间更厚,作者通过随机化粒子半径实现这一效果。最终,展示了调整后的粒子光环更美观,具有中间厚、两边薄的视觉效果。
156

被折叠的 条评论
为什么被折叠?



