unity使用底层Mono技术实现了真正的跨平台,而Mono是基于Net框架开发的,这样就可以使用一种语言开发出基于各种平台的game。

1、粒子系统概述

粒子系统是由一个个很小的粒子构成,并带有一定的物理属性。

1)基础属性

基础属性用来控制粒子生命、速度和受力影等效果。

  • Duration(持续时间):在这个时间内粒子一直发射,超过这个时间粒子停止发射,该属性经常配合Start Lifetime(初始生命)属性使用。如果Duration太短,有可能粒子还没发射出来就结束了。
  • Looping(循环):粒子在周期时间内会处于循环状态
  • Prewarm(预热):在粒子播放之前就模拟播放,然后在粒子发射出来的那一刻,粒子状态就会显示出来。该选项只有在选择Looping选项后才能启用。
  • Start Delay(初始延迟):推迟粒子的发射。Prewarm是在发射之前模拟发射,而Start Delay是在正常开始发射的时候不发射,推迟一定时间发射。该属性只有在选择Prewarm选项后才能启用。
  • Start Lifetime(初始生命):粒子从出生显示到死亡消失所经历的时间,即粒子的生命。单击该属性后面的下拉菜单,可以设置不同的模式。

  1.  Constant(恒定常数):与发射的粒子生命数值完全一样,生命数值是一个恒定值。
  2. Curve(曲线):在Inspector面板底部的Particle System Curves(粒子系统曲线)区域中,可以以曲线的方式控制Start Lifetime(初始生命)属性。曲线的模式可以灵活地控制属性,得到丰富的效果。
  3. Random Between Two Constants(两个常数之间的随机值):在两个常数之间取一个随机值,是模拟自然发生的一种随机效果,更符合视觉效果。
  4. 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(发射)

该属性可以设置发射的速率和粒子的爆发状态。

  1. Rate(速率):控制每秒发射粒子的数量
  2. 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,给新的水花贴图,再赋给水花粒子。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐