简单粒子制作
要求
- 按参考资源 Unity3d-Particle System 系统的学习(三)的要求,制作一个粒子系统;
- 使用 3.3 节介绍,用代码控制使之在不同场景下效果不一样。
相关理论
粒子系统
- 模拟一些不确定、流动现象的技术;
- 采用许多形状简单且被赋予生命的微小粒子作为基本元素来表示物体(一般由点或很小的多边形通过纹理贴图表示),表达物体的总体形态和特征的动态变化;
- 常使用其模拟的现象有火、爆炸、烟、水流、火花、落叶、云、雾、雪、尘、流星尾迹或类似发光轨迹的抽象视觉效果等;
- 使用粒子仿真物理现象受一些简单的规则(主成分)支配,粒子系统涉及了多门课程(物理学、信息论、计算机图形学、系统控制与仿真、随机过程等)。
粒子(Particle)
- 粒子系统管理的基本单位;
- 一般是材料(Material),其包含纹理(texture)、shader 两个内容,分别负责形态、光照效果两个方面;
- 通常粒子系统包含基础材料库供用户选择。
生命周期
- 每个粒子都有自己的生命周期,包括初始化状态、运动变化状态、回收状态;
- 根据归一化生命周期,控制粒子的运动与变化。
渲染(render)
- 定义粒子材料与摄像机之间的关系,主要包括材料面方位、显示顺序、光照等信息;
- 如果是 3D 渲染,则需要 uv 贴图网格。
运动管理
- 粒子运动学或物理学管理,包括颜色、力场、速度、碰撞等属性。
发射器管理
- 粒子工厂的管理,包括粒子初始化、喷射位置与形状等。
Unity 粒子系统
Unity 粒子系统是复杂的组件,且粒子效果制作是一件复杂的事情,包括噪音、碰撞等技巧。
- 从 2019.4 版本开始,支持 Visual Effect Graph ;
- 内置粒子系统与 Visual Effect Graph 解决方案的不同,参考网站:选择粒子系统解决方案 。
粒子系统属性与主要子模块:
- 使用【菜单 -> GameObject -> Effects -> Particle System】,在游戏对象场景中添加一个 Particle System;
- 选择该 Particle System ,在 Scene 中见到仿真执行控制窗口;
- 在 Inspector 中见到 Particle System 组件。
1. 粒子与材料
- 默认粒子物体是面片(Quad);
- Render 模块 的 Material 属性最重要;
- 在 标准资源库/ParticleSystem/Materials 中的一些材质,可以拖拉到 Material 属性;
- 点 Play 按钮仿真执行,可以观察不同材料喷发出来的效果;
- 如果材料是 2D 动画,如 ParticleFlames 是 8 X 4 的动画;
- Texture Sheet Animation 模块 设置 Tiles 属性,可以观察到动画被喷发出来的效果。
2、粒子生命周期与初始状态
粒子系统 (Particle System) 主模块 的参数可以控制粒子生命周期等全局属性。
其主要属性包括:
- Duration: 发射器喷粒子的时间长度;
- Looping: 如果启用此属性,系统将在其持续时间结束时再次启动并继续重复该循环;
- Prewarm: 如果启用此属性,系统将初始化,就像已经完成一个完整周期一样(仅当 Looping 也启用时才有效);
- Start Lifetime: 粒子的初始生命周期;
- Start Speed: 每个粒子在适当方向的初始速度;
- Start …
修改这些参数,可以观察到粒子的变化。
3、发射器设置
由两个模块组成:
- Emission 模块:其属性会影响粒子系统发射的速率和时间,其中有一个突发发射配置表;
- Shape 模块:用于定义可发射粒子的体积或表面以及起始速度的方向。
4、运动和变化管理
… over Lifetime 或 … by Speed 模块都是控制变化的。
勾中 Size over Lifetime 模块,在Inspector 下方的 曲线编辑器 进行编辑。
为粒子设置 Gradient 颜色时,将显示 渐变编辑器 (Gradient Editor):
- Mode: 确定是否混合粒子颜色设置;
- Color: 显示渐变中当前所选关键点的颜色,使用此项可以编辑渐变中该位置的颜色;
- Location: 显示当前所选关键点在渐变上的距离;
- Presets: 保存渐变设置,单击 New 可将当前值集设置为渐变预设;
- 各种模块中的颜色属性按照每个通道相乘,从而计算出最终的粒子颜色结果。
拟物控制
用粒子系统模拟现实,需要通过编码,使游戏开发人员通过定制的可理解参数控制物理现象。
参考:官方手册中的 汽车尾气模拟 的案例。
编写代码让用户更容易地使用粒子系统产生不同引擎效果:案例中的代码定义了引擎类型、引擎磨损程度与排烟效果之间的关系,使用户可以通过调整这些易于理解的参数来控制效果。
制作过程
粒子部件是一个非常复杂的对象,分为许多子部件,每个子部件也有许多属性,而精通这些部件并制作、控制粒子系统是复杂的。因此,可以在获取一个粒子效果预知之后,学习如何对其进行使用和控制。
根据参考资源,有:
学习实践几乎所有的 Particle System 用到的参数,制作类似带有光晕的魔法球的粒子。
准备
【资源】该粒子用到的贴图和材质 :
实现
分解整体粒子,其中包含以下部分:
- 光晕(不止一个)
- 星光
光 / 光晕
因为光晕是粒子的整体部分,所以可以把它当做粒子的父类节点。
直接先做粒子的主体部分——光晕。
因为中间部分的粒子不会移动,所以得把粒子的Speed设置为0,然后粒子的Shape可以设置为Box或者Sphere,因为主要的目的是让光晕填充完这个粒子,显的饱满。
还有光晕由于受四周的光照影响,在实际中,在光晕从出生到消失的时候,肯定是无中生有,那么一切光从黑暗中来最后消失与黑暗,所以最外部的颜色肯定是黑色。
因此其参数的数值为:
然后接着创建子粒子,由于这只是一个骨架,还需要其他的粒子来修饰,所以这个子粒子就是修饰用的。而由于我们目前已经创建的只是光,并没有很强的光晕,所以修饰的东西就是增强光晕效果。
那么,光晕是通向四周360度的,所以再出生的旋转方向应该是四周随机的;且光晕的Shape可以定义为任何形状,只要把半径啥的都改成0,它就将从一个点发散出去。
因此其参数的数值为:
星光
再创建下一个子 Particle,制作闪光球中冒出的星光。
星光的特征为无中生有,且出生的时候颜色应该和闪光球的颜色一致,然后越来越淡(白色),最后消失于黑暗中(黑色);从大到小,最后消失;发射的shape随意,只需要能向四周发射就,Sphere 和 HimeSphere 都可以。
其参数的数值为:
制作结果与控制
经过上述步骤,可以得到粒子:
用代码控制使之在不同场景下效果不一样:
代码 Particle.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Particle : MonoBehaviour
{
public float engineRevs;
public float exhaustRate;
ParticleSystem exhaust;
// Start is called before the first frame update
void Start()
{
exhaust = GetComponent<ParticleSystem>();
}
// Update is called once per frame
void Update()
{
exhaust.emissionRate = engineRevs * exhaustRate;
engineRevs = engineRevs + 10;
}
}
实现结果: