粒子系统
3D游戏设计第八次作业
前言
这是中山大学2020年3D游戏设计的第八次作业,如有错误,请指正,感谢您的阅读。
说明
- 本次实现的是作业一——简单粒子制作
- 实现了一个粒子系统
- 实现了用代码控制粒子系统
- 拓展:多个粒子系统的合成
粒子系统制作
ParticleSystem 的基本用法
main
定义解释:
- Duration:发射器发送粒子持续的时间
- Looping:是否循环发射粒子
- Prewarm:在Looping勾选之后才能使用,翻译是预热粒子发射。
- Start Delay:发射延迟时间,暂停x秒后开始发射粒子
- Start Lifetime:粒子的生命周期,有Constant,Curve,Random Between Two Constants和Randow Between Two Curves四种类型可以选择
- Start Speed:粒子被创建时具有的速度
- Start Size:粒子被创建时具有的初始大小
- 3D StartRotation:需要往一个方向旋转粒子时候使用
- Start Rotation:粒子初始旋转
- Start Color:初始颜色
- Gravity Modifier:修正重力
- Simulation Space:发射坐标,Local是默认的,也可以选择World或者Custom。选择Local,粒子属于本地粒子发射器;选择World,移动粒子发射器,已经发射的粒子不会随着发射器移动;Custom,粒子跟着指定的物体移动
- Simulation Speed:模拟Update
- Delta Time:时间增量
- Scaling Mode:三种选择,Local:忽略父级的缩放;Hierarchy:跟随父级缩放;Shape:跟随初始位置
- Play On Awake:是否Awake时就播放
- Emitter Velocity:用什么运动方式来进行移动
- Max Particles:一个duration内最多发射的粒子数目
- Auto Random Seed:随机种子
- Stop Action:是否停止使用粒子系统
- Culling Mode:暂停模式
- Ring Buffer Mode:粒子不会在它们的生命周期结束时死亡,而是会一直活着,直到最大的粒子缓冲区满了,那时新的粒子将取代最老的粒子,也就是替代模式
Emission
控制粒子释放和爆炸释放的频率
变量用来控制每秒释放的粒子数和每单位长度释放的粒子数
Shape
定义解释:
- shape:发射粒子的形状
- radius:发射的粒子的半径
- radiusThickness:发射粒子的形状厚度
- arc:发射粒子的圆弧的角度(mode:模式,spread:在特定弧线上产生粒子)
剩下是设定位置等都不需要改变
Velocity over Lifetime
控制粒子在剩余时间内的速度
Color Over LifeTime
控制粒子在剩余时间的颜色
Size Over LifeTime
可以根据生命周期调整粒子的大小。点击上面的线段可以新建一个拐点,因此可以创造出各式各样大小变化的粒子
Renderer
渲染器,能做出绚丽的粒子效果很大程度看渲染器如何设置,设置决定了粒子的图像如何被其他粒子交换,着色和过度绘制。
照例利用给出的参数来讲解:
- Render Mode:渲染粒子的模式
- Billboard:粒子始终面向摄像机。
- Stretched Billboard:粒子面向摄像机,但是会应用各种缩放
- Camera Scale:根摄像机运动拉伸粒子。为0禁用相机运动拉伸
- Velocity Scale:根据粒子速度比例拉伸粒子。为0禁用
- Length Scale:沿着粒子速度方向根据粒子当前大小按比例拉伸粒子。为0则会使粒子消失
- Horizontal Billboard:粒子平面与xz“地板”平面平行
- Vertical Billboard:粒子在世界y轴上直立,但面向摄像机
- Mesh:从3D网格而非从纹理渲染粒子
- None:使用Trails模块时,如果只是想渲染轨迹并隐藏默认渲染,则可使用此属性
- Normal Direction:用于粒子图形的光照法线的偏差。值为1表示法线指向摄像机,值为0表示法线指向屏幕中心(仅适用于Billboard模式)
- Material:渲染粒子的材质
- Trail Material:渲染粒子轨迹的材质
- Sort Mode:绘制粒子的顺序
- Sorting Fudge:粒子系统排序的偏差。较低的值会增加粒子系统在其他透明对象(包括其他粒子系统)上绘制的几率。对整个系统有影响,对单个粒子排序没影响
- MinParticle Size:最小粒子大小
- MinParticle Size:最小粒子大小
- Render Alignment:使用下拉单选框选择粒子公告牌面向的方向
- view:粒子面向摄像机平面
- world:粒子与世界轴对齐
- Local:粒子与游戏对象的变换组件对齐
- Facing:粒子面向摄像机游戏对象的直接位置
- Flip:在指定轴上镜像一定比例的粒子
- Allow Roll:控制面向摄像机的粒子是否可以围绕摄像机的z轴旋转
- Pivot:修改粒子的中心轴点
- Visualize Pivot:在scene视图中预览粒子的轴心点
- Masking设置粒子系统渲染的粒子在与遮罩交互的行为方式
- No Masking:不与实体中任何遮罩交互
- Visible Indide Mask:在由遮罩覆盖的地方是可见的,而在遮罩外部不可见
- Visble Outside Mask:在遮罩外部是可见的,而在遮罩内部不可见,遮罩会隐藏其覆盖的粒子部分
- Apply Active Color Space:在线性颜色空间中渲染时,系统会在将粒子颜色上传到 GPU 之前从伽马空间转换粒子颜色
- Custom Vertex Streams:配置材质的顶点着色器中可用的粒子属性
- Cast Shadows:启用此属性,粒子在光下回产生阴影
- Receive Shadows:决定阴影是否可投射到粒子上
- Shadow Blas:沿着光照方向移动阴影以消除因使用公告牌来模拟体积而导致的阴影瑕疵
- Motion Vectors:运动矢量
- Sorting Layer ID:渲染层级
- Order in Layer:此渲染器在排序图层中的顺序
- Light Probes:基于探针的光照插值模式
- Reflection Probes:如果启用此属性,并且场景中存在反射探针,则会为此游戏对象拾取反射纹理,并将此纹理设置为内置的着色器 uniform 变量
Flash——烟花特效
配置
效果
Spark——闪烁特效
配置
效果
Circle——召唤阵特效
配置
效果
Smoke——浓烟雾特效
配置
效果
Smoke2——轻烟雾特效
配置
效果
移动
移动使用代码实现,如下所示
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
ParticleSystem ps;
int direction;
void Start()
{
ps = GetComponent<ParticleSystem>();
direction = 0;
}
void Update()
{
int minX = -4, maxX = 4;
if (direction == 0 && ps.transform.position.x > minX)
ps.transform.position += Vector3.left * Time.deltaTime * 3;
else if (direction == 1 && ps.transform.position.x < maxX)
ps.transform.position += Vector3.right * Time.deltaTime * 3;
else direction = 1 - direction;
}
}
挂载到每个粒子特效上
天空盒
天空盒使用了AllSkyFree中的Cold Sunset,如下所示:
效果图
感悟
本次实验是一个粒子系统的制作,首先我学习了基本的制作流程,然后利用网上的资源制作了五个特效,将他们合成了同一个系统。因为老师要求要使用代码控制粒子系统,所以制作了整个粒子系统的移动。通过本次作业,不仅学习了制作整个的粒子系统,而且学会了如何使用代码控制它们,为以后制作完整游戏的特效奠定了基础。