粒子更新器
中级 美术 程序员
粒子生成后,在消失之前可以随时间发生变化。更新器(Updater) 随时间作用于所有存活的粒子,改变位置、速度、颜色等属性。例如,重力以恒定速率更新粒子的速度,使其加速飞向地面。
Stride 具有多种内置更新器。自定义粒子示例演示了如何向引擎添加更新器。
通用属性
多个属性在许多更新器中是通用的。

| 属性 | 描述 |
|---|---|
| Debug draw | 绘制调试线框形状以显示更新器的边界。此功能仅适用于编辑器,运行游戏时会被忽略。 |
| Position inheritance | 继承粒子系统组件的位置,如 Transform 字段中所定义 |
| Position offset | 模块的额外平移。如果它继承了父级的位置,这会应用在继承的位置之上。 |
| Rotation inheritance | 继承粒子系统组件的旋转,如 Transform 字段中所定义 |
| Rotation offset | 模块的额外旋转。如果它继承了父级的旋转,这会应用在继承的旋转之上。 |
| Scale inheritance | 继承粒子系统组件的均匀缩放,如 Transform 字段中所定义。 |
| Scale offset | 模块的额外缩放。如果它继承了父级的缩放,这会应用在继承的缩放之上。 |
碰撞体(Collider)

碰撞体(Collider) 是一个更新器,当粒子与预定义形状碰撞时改变粒子的位置和速度。

| 属性 | 描述 |
|---|---|
| Shape | 粒子与之碰撞的形状(球体、圆柱体、盒体或圆环体) |
| Is hollow | 禁用时,形状是实心的,粒子会从它上面弹开。启用时,形状像容器一样是中空的,粒子会留在体积内部。 |
| Kill particles | 启用时,粒子在与形状碰撞时立即被销毁。 |
| Restitution | 恢复系数是粒子相对于碰撞前速度所保留的速度。在此更新器中,我们将恢复系数用作仅垂直方向的速度。它不影响沿表面的速度。 |
| Friction | 粒子与形状碰撞时损失的水平速度。它只影响沿表面的速度,不会改变粒子弹起的高度。 |
力场(Force field)

力场(Force field) 由一个包围形状和若干力向量定义,这些力向量基于粒子相对于包围形状的位置对粒子起作用。

| 属性 | 描述 |
|---|---|
| Shape | 包围形状(球体、圆柱体、盒体或圆环体) |
| Falloff | 衰减是一个简单的线性函数,它决定施加在粒子上的力的强度。它基于粒子到中心的距离。Strength inside(内部强度)是当粒子位于中心 falloff start 距离以内时适用的强度比例。Strength outside(外部强度)是当粒子距离中心超过 falloff end 时适用的强度比例。两个值都相对于包围形状的大小;中间的值在两个强度之间插值。中心处的值仍然可以为 0,使力仅在包围形状外部起作用。 |
| Energy conservation | 粒子保留的力能量的部分。保留的能量存储为粒子速度,导致速度逐渐增加。未保留的能量直接作用于粒子的位置,并在力消失时损失。 |
| Directed force | 使粒子沿力场中心轴(通常为向上)移动的向量力 |
| Vortex force | 使用右手定则旋转,使粒子绕力场中心轴移动的力 |
| Repulsive force | 使粒子远离力场中心或(如果为负值)向中心移动的力 |
| Fixed force | 使粒子沿固定的、不旋转不缩放的轴移动的力 |
衰减
衰减(falloff) 是力的强度基于粒子到形状中心距离的变化。衰减是相对距离的函数,其中距离 0 为中心,1 为形状的边界,大于 1 表示粒子在形状外部。
比衰减起点更近的粒子始终受 Strength Inside 系数影响。比衰减终点更远的粒子始终受 Strength Outside 系数影响。
介于两者之间的粒子的系数呈线性变化:

例如,如果包围形状是半径为 10m 的球体,距其中心 1m 以内(0.1 x 10m)的粒子将受到全力移动。超过 1m 距离后,强度线性下降,直到在 9m 距离处(0.9 x 10m)变为零。此后,力不再影响粒子。
包围形状
球体

图片许可:CC-BY-SA 4.0,球体图片来自 "Sphere wireframe" 作品,作者 Geek3,采用 CC-BY-SA 3.0
当包围形状为球体时,衰减距离基于粒子到球心的径向距离。如果球体被缩放为椭球体,该距离也会相应缩放。该距离相对于半径,1.0 为球体表面。
定向力向量与球体的局部 Y 轴平行。排斥力向量从中心指向粒子。涡旋力向量在粒子位置处绕球体的 Y 轴旋转(使用右手定则)。
盒体

当包围形状为盒体时,衰减距离是 X、Y 和 Z 轴上三个距离中最长的一个。该距离相对于盒体的尺寸,1.0 为盒体表面。
定向力向量与盒体的局部 Y 轴平行。排斥力向量从中心指向粒子。涡旋力向量在粒子位置处绕盒体的 Y 轴旋转(使用右手定则)。
圆柱体

当包围形状为圆柱体时,衰减距离基于粒子到圆柱体局部 Y 轴的径向距离。粒子的高度(在 Y 轴上的位置)会被忽略,除非粒子在圆柱体外部,此时距离始终为 1。
定向力向量与圆柱体的局部 Y 轴平行。排斥力向量从圆柱体的局部 Y 轴指向粒子,因此排斥力始终是水平的。涡旋力向量在粒子位置处绕圆柱体的 Y 轴旋转(使用右手定则)。
圆环体

图片许可:GFDL,CC-BY-SA 4.0,圆环体图片来自 "A simple Torus" 作品,作者 Yassine Mrabet,采用 GFDL,CC-BY-SA 3.0
当包围形状为圆环体时,力场的性质会完全改变。衰减距离基于粒子到圆环体内圈(旋转轴,图中以红色显示)的径向距离,选择圆上离粒子最近的点。
定向力向量与离粒子最近点处的旋转轴相切。排斥力向量从轴指向粒子。涡旋力向量利用粒子相对于轴的位置绕定向力向量旋转(使用右手定则)。
虽然数学运算有点复杂,但使用圆环体力场并不复杂。试试看吧!
重力(Gravity)
重力更新器是一个简化的力,它以恒定的力向量(不缩放也不旋转)影响所有粒子,无论它们的位置如何。它是可编辑的,因此你可以在不同缩放和行为的项目中使用它。

重力忽略大多数属性(如偏移和继承),只使用以下属性:
| 属性 | 描述 |
|---|---|
| Gravitational acceleration | 定义所有受影响粒子加速度的重力向量。默认值与地球的平均重力相符。 |
由速度确定方向(Direction from speed)
由速度确定方向是一个后置更新器(post-updater),这意味着它在非后置更新器之后解析,即使后者在列表中出现得更晚。
它没有属性,只是将粒子的方向更新为与其速度匹配。它使用粒子上一帧与当前位置之间的差值,并不直接依赖于速度。这意味着即使粒子自身的速度为 0,仅被外力移动,由速度确定方向也能正确解析。
方向不是归一化向量,它会改变其大小以匹配增量距离。它会覆盖任何先前的方向参数,例如来自初始化器的方向。
颜色动画(Color animation)
颜色动画是一个后置更新器,这意味着它在非后置更新器之后解析,即使后者在列表中出现得更晚。
颜色动画通过在粒子的归一化存活时间(0 到 1)上采样一条曲线来更新粒子的 Color 字段。你可以设置第二条曲线,在这种情况下粒子的颜色会有细微变化。颜色动画会覆盖任何先前的颜色参数,例如初始颜色。
曲线值以 Vector4 给出,对应 RGBA,标准值介于 0 和 1 之间。大于 1 的值仅对 RGB 有效(不适用于 Alpha),可用于 HDR 渲染。
旋转动画(Rotation animation)
旋转动画是一个后置更新器,这意味着它在非后置更新器之后解析,即使后者在列表中出现得更晚。它是严格的单轴旋转,用于面向公告板的粒子。
旋转动画通过在粒子的归一化存活时间(0 到 1)上采样一条曲线来更新粒子的 Rotation 字段。你可以设置第二条曲线,在这种情况下粒子的旋转会有细微变化。
旋转动画会覆盖任何先前的旋转参数,例如初始旋转。如果你需要叠加类型的动画,请检查 Shape Builder 是否支持它(在 Shape Builder 的属性中找到)。叠加动画不会保留在粒子字段中,也不会持久存在,但可以在粒子已有的任何字段之上应用。
大小动画(Size animation)
大小动画是一个后置更新器,这意味着它在非后置更新器之后解析,即使后者在列表中出现得更晚。
这是严格的均匀大小。大小动画通过在粒子的归一化存活时间(0 到 1)上采样一条曲线来更新粒子的 Size 字段。你可以设置第二条曲线,在这种情况下粒子的大小会有细微变化。
大小动画会覆盖任何先前的大小参数,例如初始大小。如果你需要叠加类型的动画,请检查 Shape Builder 是否支持它(在 Shape Builder 属性中)。叠加动画不会保留在粒子字段中,也不会持久存在,但可以在粒子已有的任何字段之上应用。