Unity3D的ParticleSystem粒子特效
介绍unity3d中粒子系统的使用,包括基础属性的介绍,多个示例的介绍
unity使用底层Mono技术实现了真正的跨平台,而Mono是基于Net框架开发的,这样就可以使用一种语言开发出基于各种平台的game。
1、粒子系统概述
粒子系统是由一个个很小的粒子构成,并带有一定的物理属性。
1)基础属性
基础属性用来控制粒子生命、速度和受力影等效果。
- Duration(持续时间):在这个时间内粒子一直发射,超过这个时间粒子停止发射,该属性经常配合Start Lifetime(初始生命)属性使用。如果Duration太短,有可能粒子还没发射出来就结束了。
- Looping(循环):粒子在周期时间内会处于循环状态
- Prewarm(预热):在粒子播放之前就模拟播放,然后在粒子发射出来的那一刻,粒子状态就会显示出来。该选项只有在选择Looping选项后才能启用。
- Start Delay(初始延迟):推迟粒子的发射。Prewarm是在发射之前模拟发射,而Start Delay是在正常开始发射的时候不发射,推迟一定时间发射。该属性只有在选择Prewarm选项后才能启用。
- Start Lifetime(初始生命):粒子从出生显示到死亡消失所经历的时间,即粒子的生命。单击该属性后面的下拉菜单,可以设置不同的模式。
- Constant(恒定常数):与发射的粒子生命数值完全一样,生命数值是一个恒定值。
- Curve(曲线):在Inspector面板底部的Particle System Curves(粒子系统曲线)区域中,可以以曲线的方式控制Start Lifetime(初始生命)属性。曲线的模式可以灵活地控制属性,得到丰富的效果。
- Random Between Two Constants(两个常数之间的随机值):在两个常数之间取一个随机值,是模拟自然发生的一种随机效果,更符合视觉效果。
- Random Between Two Curves(两曲线之间的随机值):取曲线间的值。通过自定义曲线的形状来控制Start Lifetime的效果。
- Start Speed(初始速度):设置粒子发射时的初始速度
- Start Size(初始大小):设置粒子发射时的尺寸大小
- Start Rotation(初始旋转):设置粒子发射时的数值
- Start Color(初始颜色):设置粒子的颜色变化
- Gravity Multiplier(调节重力):使粒子受到重力影响产生下落的效果
- Inherit Velocity(粒子速度的变换因素):设置粒子的继承速度
- Simulation Space(模拟空间):一种是Local(本地坐标),另一种是World(世界坐标)。本地坐标在拉动粒子时,发射出的粒子是跟着发射器进行移动的,没有惯性。而世界坐标在拉动粒子时,原来发射出的粒子保持原来的速度和方向即保持原来的轨迹移动,有惯性,这种特性可以用来制作拖尾效果,如陨石坠落时后面跟着的尾烟。
- Play On Awake(激活状态):控制特效是否还需要程序再激活一次。在制作特效时,要让它保持在一个激活的状态,因为特效在被调用时才可能显示出来,所以就默认现有的状态。
- Max Particles(最大粒子数):控制粒子的最大发射数量。
2)Emission(发射)
该属性可以设置发射的速率和粒子的爆发状态。
- Rate(速率):控制每秒发射粒子的数量
- Bursts(爆开):在特定时间里瞬间发射大量的粒子
3)Shape(外形)
该属性设置发射器(不是粒子)的外形和大小。
- Sphere(球形):正常数值下的粒子是在球的表面向外发射,可以增大或缩小发射器的半径。当把粒子的Start Speed调为负值时,粒子是向内进行收缩的一个过程。
(中间是球形)
- Cone(圆锥形):系统默认的发射方式
- Box(盒子)
- Mesh(网格)
为发射器指定一个模型,让粒子按照这个模型的顶点、边和面进行发射,可以选择Random Direction进行发射。
4)Velocity over Lifetime(粒子生命周期速度偏移模块)
根据生命时间来控制粒子偏移。
X/Y/Z:控制粒子偏移的方向。例如,当X为正值时,粒子会沿X轴的正方向偏移;若X为负值,那么粒子会沿X轴的负方向偏移。
5)Limit Velocity over Lifetime(粒子生命周期内限速模块)
该属性可以限制粒子的发射速度。
Separate Axis(分离轴):粒子没有轴向发
Speed(速度):粒子发射速度
Dampen(阻力):抑制粒子发射的速度
6)Collision(碰撞)
控制粒子的碰撞效果。碰撞有两种,一种是本地坐标中的碰撞,另一种是世界坐标里的碰撞,所有碰撞体都可以进行碰撞。
单击上面的红色按钮可以添加一个Planes(平面)属性,这时在场景视图里就会出现一个绿色的网格碰撞面板,在资源视图里的Particle System下也会自动绑定一个Plane Transform1。
Visualization(可视化操作):碰撞面板的格式有两种,一种是Grid(网格面板),另一种是Solid(固体面板)。
Scale Plane(碰撞面板的大小):设置碰撞面板在场景视图里的显示大小。Ps:碰撞面板的大小与碰撞体的大小没有太大的关系。
Dampen(阻力):当阻力为正值时,粒子将粘连到碰撞面板上;当阻力为负值时,粒子碰到面板后会反弹。
Bounce(反弹):设置粒子在接触面板后的弹力。
Lifetime Loss(生命减少):这个粒子碰到碰撞面板后以多大的阻力生存下去,如果生命进行衰减,粒子的生命也会减弱。
7)Sub Emitters(繁衍)
该属性控制粒子的繁衍效果。
Birth(出生时的繁衍):当粒子在出生时会产生另外一个粒子。
Collision(碰撞时的繁衍):当粒子在碰撞时会产生下一个粒子,是无限循环的一个过程。
Death(死亡时的繁衍):当粒子死亡时会产生下一个粒子。
2、第一个粒子特效
在Hierarchy中创建Effects -> Particle System,设置其xyz分别为0,否则可能导致Game界面不会显示粒子特效。
创建空物体并挂载如下脚本:
using UnityEngine;
public class CustomParticleEffect : MonoBehaviour
{
public ParticleSystem ps;
private void Start()
{
ps.Play();
}
}
看到效果如下:
3、实现粒子随机颜色
代码如下:
using UnityEngine;
public class CustomParticleEffect : MonoBehaviour
{
public ParticleSystem ps;
ParticleSystem.Particle[] particles;
void Start()
{
particles = new ParticleSystem.Particle[ps.main.maxParticles];
}
void Update()
{
int count = ps.GetParticles(particles);
for (int i = 0; i < count; i++)
{
Color randomColor = new Color(Random.value, Random.value, Random.value, 1);
particles[i].startColor = randomColor;
}
ps.SetParticles(particles, count);
}
}
将上一个粒子中的Particle System赋值给ps变量。
效果如下:
4、Q版火焰版本
1)上传贴图到Assets
贴图如下:
上图分为4部分,最左上角为火焰的最下面,最右下角为火焰的最上面。
2)创建材质Material
点击"+"后选择Material
3)配置Material
Shader选择 Legacy Shaders -> Particles -> Additive,
然后将Assets中的贴图拖到上图的位置
4)创建粒子系统
在Hierachy中新建Particle System,然后将上一步的material拖到该粒子系统对象。
- Start Lifetime属性切换为Random Between Two Constants模式,让粒子的生命有大有小地向上发射
- Start Rotation属性选择Random Between Two Constants模式,让火焰有一个随机旋转的效果
- 反勾选Shape,让粒子统一向上发射
- 调节Color over Lifetime,使火焰有颜色变化
- 调节Size over Lifetime的Curve曲线,让火焰在出生时最大然后慢慢变小
- 贴图是一个序列贴图,所以展开Texture Sheet Animation,设置Tiles为2*2
最后效果如下:
复制上面的粒子系统,再根据如下两张图片创建外焰、内焰的特效。
外焰的参数:
內焰的参数:
最终效果:
5、录制特效
安装Recoder组件,Package中选择Unity Registry,然后搜索Recorder
安装完成后,就可以在Window -> General -> Recorder中使用该组件
录制视频并导出为gif:
6、制作带背景图片的特效
创建一个UI->Image叫Background,随便选一张有火堆的图片作为背景。
然后把火焰的3个粒子系统1、2、3也放到Canvas中
整体的架构如下:
1)修改Canvas的Render Mode
从默认的Screen Space - Overlay修改为Screen Space - Camera
Screen Space - Overlay:叠加模式,UI会覆盖在场景上,场景中的粒子特效就无法展示出来。
选择Render Camera为Main Camera
2)修改Image的Renderer配置
添加Sprite Renderer组件,设置layer信息如下:
3)修改粒子系统的Renderer配置
Order in Layer越大越显示在前面。
得到效果如下:
7、雨雪特效
对于雨雪特效,并不是整个场景都有雨或雪,而是绑定在摄像机上的特效。
绑定就是把下雨或下雪的特效拖到摄像机下,在拖动摄像机时就会发现雪花和雨跟着摄像机移动,这样在game里面如果摄像机移动到其他地方,跟着人物来回移动时,这个人物所涉及的场景就都是下雨或下雪的效果。
但是如果雨或雪跟着摄像机来回快速移动时,这样的相对运动势必会造成假象。为了避免这样的问题,需要多做几个粒子来让粒子系统有的发射到世界坐标,有的发射到本地坐标,否则粒子会跟不上摄像机的速度。
核心是:
1)旋转粒子的发射方向:因为粒子的发射是有方向性的,所以在没有给重力的情况下,将粒子旋转后,粒子也是可以向下发射的。
2)将粒子Simulation Space的坐标改为World(世界坐标),当人物走动时整个绑定在人物身上的特效也会随之移动,就不会出现场景空白的现象。
效果如下:
8、雨滴特效
雨滴和雪花特效的区别在于:雨滴掉在地上后(粒子死亡后),需要产生另一个粒子(水花)的特效。
如上一个雪花特效,创建Plane,创建一个粒子系统并且旋转x轴。
1)修改Render Mode
修改Render Mode为Stretched Billboard(拉伸的渲染)。雨滴掉落时像一条细细的线。同时设置Speed Scale为0.4。
2)设置Sub Emitters
设置前一个粒子Death死亡后使用新的粒子。
此时,在Hierarchy视图中,会出现一个名为SubEmitter的子粒子,名为水花粒子。
然后创建Material,给新的水花贴图,再赋给水花粒子。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)