
Niagara粒子系统-超炫酷的闪电特效第二期 旋转的纸片做闪电特效做到第二期我越来越觉得一个真理闪电特效好不好看七成看主体电弧剩下三成全看周边的环境反馈。第一期我把闪电主干和分支电弧的材质、扭曲、随机分叉全部搞定之后跑起来一看总觉得少了点什么——电弧是有了但它像悬浮在空中的一根光管和场景没有任何互动。后来我意识到真正让一个闪电特效“落地”的是那些被闪电击中瞬间激起的碎纸片、灰尘、小碎片。它们疯狂旋转着飞散随后在重力作用下飘落这个过程能瞬间把闪电的冲击力拉满。所以第二期“旋转的纸片”核心任务就是在Niagara里做一套环境碎片粒子系统。它不是主角但它是让闪电活得起来的灵魂配角。这套粒子系统的技术点主要集中在发射器参数配置、粒子旋转控制、材质制作、力场和碰撞调校以及与第一期闪电主干的整合。适合已经能做出基础闪电电弧、想在细节表现力上更进一步的朋友参考。1. 为什么闪电特效需要“旋转纸片”视觉层次的秘密1.1 闪电电弧与碎片的真实物理关系现实中闪电击中地面、树干、楼顶的一瞬间会发生什么空气被瞬间加热到极高温度产生剧烈的冲击波同时击点附近的物体表面会因为热膨胀和冲击力被撕裂碎屑、泥土、纤维、树叶碎末被炸得向四周飞散。这些碎片在空中不规则地翻滚旋转被闪电的余光照明形成一道道橙黄色或蓝白色的轨迹。我们的视觉系统对这类“次级运动”非常敏感。电弧是线性的、一闪而过的它存在于极短的时间窗口内而碎片飞散是一个持续几百毫秒到几秒的过程。两者叠加让大脑判断“这个闪电具有真实的能量传递过程”。所以如果你只做电弧不做碎片观众可能说不出哪里怪但就是觉得假。这就是为什么我在第二期专门做“旋转的纸片”——弥补环境的反馈缺失。1.2 纸片粒子的双重职责碎片飞溅与气流可视化在具体设计粒子系统之前我先想清楚“纸片”在特效里到底承担什么职责。它其实有两个层面的作用第一个层面是字面意义上的碎片飞溅模拟被闪电击碎的小纸片、树叶、尘土。这些粒子应该从击点位置向外爆开带有高速的初始速度然后在重力和空气阻力作用下减速、飘落。第二个层面是视觉上“看不见的气流”纸片因为是面片状、旋转着飘落它的运动轨迹受风场影响非常明显所以观众通过观察纸片飞行的方向、速度变化可以“看见”闪电冲击波扩散时气流的走向。这也是为什么很多影视游戏特效里都用飘落的落叶、纸片来表现爆炸冲击和风向。明白了这两层职责我就确定了粒子系统的基本设计方向粒子初始发射位置在闪电击点初始速度范围要大模拟爆轰推进角速度要随机且数值较高体现翻滚感生命周期不用太长0.5到2秒之间发射数量不需要夸张20到60枚在大多数场景就够了。方向不是统一向外而是球形随机这样符合爆炸的扩散逻辑。1.3 为什么“旋转”是第二期的核心戏码很多人做碎片粒子喜欢直接给一个线速度让粒子直挺挺地飞出去再掉下来。这个做法做木块、石块还行但做“纸片”就完全不对味。纸片之所以看起来“飘”是因为它在飞行过程中持续旋转正面和背面交替朝向来流方向空气阻力随之变化运动轨迹会呈现出一种不规则的摆动和沉降。在Niagara里实现这种旋转感关键是把粒子自转Sprite Rotation和角速度Angular Velocity同时做进来并且给它们设置随机分布范围。这样每一枚纸片都有自己独立的旋转轴和转速飞出去之后轨迹各不相同视觉上看就是一团乱中有序的翻滚碎片。这个细节就是第二期和普通碎片特效拉开差距的地方。2. 纸片发射器的搭建Niagara里的关键配置实操2.1 发射器类型选择与基础属性设置打开Niagara系统编辑器我先在现有的闪电特效系统里新建一个发射器Emitter命名为“Debris_Paper”。渲染器类型选择“Sprite Renderer”——这里有个关键点很多新手会纠结要不要用Mesh Renderer来搞一个真正的3D纸片模型我的结论是不需要也不建议。用Sprite Renderer配合带纸片形状的贴图是性能最省、效果最可控的做法。因为Sprite永远面向摄像机你不需要为几百个纸片模型做朝向计算而且材质可以统一管理。对于这种数量不大、形态简单的碎片粒子Sprite完全够用。如果你追求完全物理正确的纸片翻转那Mesh Renderer加物理资产是另一个更重的方案那个咱们后面再聊。发射器属性里我设置了几个关键参数Sim Target模拟目标CPU。这个碎片发射器只有几十个粒子CPU模拟完全没压力。而且CPU模拟的Collision和Force模块兼容性更好调试方便。GPU Sim更适合动辄几万粒子的大场面这里杀鸡不用牛刀。生命周期设置为先让它自动循环方便调试最终接入闪电主干时再改成按需触发。局部空间Local Space关闭。因为闪电和击点都在世界空间坐标里粒子需要和世界交互重力、风场必须关掉局部空间。2.2 Spawn阶段的粒子生成条件在Emitter Update发射器更新阶段我添加了Spawn Burst Instantaneous瞬时爆发生成模块。参数很好理解Spawn Count设为40表示每次触发时一次性生成40枚粒子。这40枚粒子不能同时从同一个点飞出去那样会挤成一团。所以我在Initialize Particle初始化粒子里大做文章参数项设置值设计意图Position位置击点坐标加Scale Color随机偏移0-15让粒子在击点附近小范围内散开不至于完全叠在一个点上Velocity速度球形方向范围为 300 到 1200模拟爆炸推进力度保证碎片能飞远Sprite Size精灵尺寸随机 2 到 8约真实10-40cm大小交叉让碎片有层次感Sprite Rotation随机 -180 到 180 度初始朝向随机避免所有纸片初始朝向一致Lifetime生命周期随机 1.0 到 2.5 秒长短错开飘落过程更自然Sprite Angular Velocity随机 -360 到 360 度/秒关键中的关键每枚纸片的旋转速度独立随机这个表格基本就是我调试定稿的参数。其中Sprite Angular Velocity的随机范围我是反复试出来的。一开始我把范围设成-180到180旋转太慢纸片像在“漂”而不是“翻滚”后来改成-720到720转速过快纸片看不清形态成了一圈模糊的光斑。最后锁在-360到360度每秒既有清晰的纸片识别度又有明显的翻滚感。2.3 Update阶段的旋转与运动控制粒子生成只是一瞬间真正让粒子动起来、转起来的是Update更新阶段的常驻模块。这里我做了三层设置第一层Apply Velocity应用速度。这个模块把初始化时注入的初速度持续应用到粒子上。注意这里不是每帧加力而是持续保持粒子的运动状态。第二层Drag阻力——这个模块很重要。纸片飞行时空气阻力不能忽视尤其纸片受到阻力后还会产生明显的减速和晃动。我设置Drag参数在0.1到0.3之间同时配合一个随机扰动。这个阻力的数值决定了纸片飞出去之后是“笔直飞远”还是“飘了一下就无力地下坠”我推荐从0.2起步微调。第三层Scale Sprite Size缩放精灵尺寸。纸片在生命周期里会由大到小最终在飘落过程中缩小消失。我做了个曲线前20%维持原始大小中间50%缓慢缩小到70%最后30%快速缩小到0。这个细节是为了模拟纸片在飘远后视觉上变小和淡出避免粒子像鬼一样凭空消失。3. 纸片材质的制作让一张“纸”有被闪电照亮的质感3.1 材质节点的核心逻辑粒子系统里最终呈现的纸片质感完全由材质决定。我建了一个Material叫“M_PaperDebris”材质域设为Surface混合模式Blend Mode为Translucent着色模型Shading Model为Unlit无光照。有朋友可能会问为什么用Unlit纸片不是应该被闪电照亮吗这里有个细节闪电特效发生后场景中的动态光源通常是点光源或者矩形光源配合闪电闪烁。如果用Lit材质纸片的颜色变化受灯光方向和亮度制约很难保证特效演出效果。而Unlit材质可以直接用自发光模拟“被闪电瞬间照亮”的感觉颜色完全可控不会因为场景光源角度变化出现纸片面突然变黑的情况。对于持续时间不到2秒的演出型特效来说Unlit是行业标配做法稳定且效率高。材质节点大概这样一层层做下来基础颜色用粒子属性Particle Color驱动一个ColorRamp颜色渐变节点从亮黄白到暖橙色过渡。透明通道关键节点是乘上一个Noise贴图。一张黑白噪波贴图可以让纸片边缘出现不规则的锯齿状撕边而不是一个完美矩形。我用的Noise贴图是程序纹理Tile重复次数设为2到3防止贴图拉伸痕迹明显。这里要特别说一下“撕边”的处理。现实中被闪电撕裂的纸片边缘绝不会是平直的而是毛糙、卷曲、焦黑的。在材质里我用了两层Noise第一层做整体Alpha遮罩的撕边第二层在边缘做一圈暗色焦边效果。这个焦边我用一个Lerp节点把靠近边缘的像素向橙褐色偏移模拟被闪电高温灼烧的痕迹。一旦有了这个焦边纸片的质感立刻从“贴图”变成了“实物”。3.2 让材质支持纸片的旋转方向感材质的另一个关键点是Sprite的旋转信息必须能传到材质里。Niagara默认会在Sprite Renderer的渲染过程中把粒子的Rotation信息应用到纹理坐标上所以材质里的TexCoord会自动跟着粒子旋转。这意味着如果纸片贴图本身带有方向性比如一端宽一端窄、或带折痕纹理那么粒子旋转时贴图也会跟着绕轴旋转视觉上就是“纸片在翻面”。这个效果非常关键。为了让它更明显我在材质里加了一个方向性高光条纹用UV坐标的X轴方向做一个细长的渐变条叠加在基础颜色上。当粒子旋转时这条高光条纹会跟着转模拟纸片表面的纸张光泽。这个细节在很大程度上增强了“3D翻转感”——尽管Sprite本质上是永远面向相机的2D面片但通过内部贴图方向的变化大脑会被骗过去。3.3 自发光与辉光的层次控制纸片被闪电照亮自发光是必须的。我在材质里用EmissiveColor输出乘了一个倍率参数默认设为3.0。这个倍率配合Post Process的Bloom效果可以让个别纸片产生微弱的辉光在暗色场景里会非常漂亮。不过辉光一定要克制。我一开始把倍率拉到了8.0结果每张纸片都像个迷你灯泡闪电主体完全被淹没在满屏光点里。后来我把倍率降下来并且用粒子属性里的一个自定义参数控制不同粒子的发光强度差异初始速度大的粒子发光强模拟刚炸开时的高温速度降下来后发光也跟随减弱。这样整体看起来就是“炸开瞬间很亮然后迅速冷却变暗”的自然过程。4. 旋转纸片的“演技”力场、碰撞与随机性的协调4.1 添加力场让纸片有“爆散”到“飘落”的阶段变化纸片粒子不能一直朝一个方向飞它需要一个从“爆轰推进”到“自然飘落”的过渡。这里我不直接用一个重力去拉粒子而是做了两阶段力场控制。第一阶段击点附近的冲击力。我用了Niagara里的RadialForce径向力模块在生成后的前0.15秒内施加一个向外扩散的力模拟爆炸冲击波对粒子的推进。这个力的强度我设为2000左右衰减半径80厘米配合粒子初速度一起作用让最内圈的纸片被二次加速。第二阶段重力与空气阻力平衡。冲击力衰减之后重力开始主导。Niagara里重力可以直接用Gravity Force模块我设置重力强度为-980UE默认重力值。同时保留一个轻微的Drag让纸片不会以自由落体的速度直挺挺砸向地面而是带着一种“翻着飘下去”的下坠感。这里有个小技巧给Drag加一个“年龄渐变”的曲线连接。粒子刚出生时Drag接近0保持爆轰速度0.3秒后Drag逐渐增大到0.35快速减速1秒后再慢慢降回0.1让纸片转为匀速飘落。这样粒子会经历“炸出—急停—飘落”三个动作阶段比单纯设一个固定Drag值要生动得多。4.2 湍流扰动打破重力和阻力的规则感重力是垂直向下的阻力是均匀减速的如果只靠这两个力所有纸片的下落轨迹会非常“整齐”——都朝同一个方向飘看起来很死板。我加了一个Turbulence Force湍流场来打破这种规则感。湍流力本质上是给粒子叠加一个随时间和空间变化的速度噪声。我用的是Niagara自带的Turbulence Force模块频率设为0.6强度设为800。这个参数决定了纸片飘落时的“抖动幅度”。强度太高纸片会像在锅里翻炒太低又感觉不到气流扰动。我在800这个值配合2倍频率的情况下能看出纸片有明显的横向漂移和上下微浮但整体还是顺着风向移动。另外我还加了两个Directional Wind定向风力参数一主一辅。主风力强度500方向沿X轴正方向模拟闪电冲击波扩散时带动的气流辅助风力强度200方向沿Z轴轻微向上模拟被闪电加热后上升的热空气。这样纸片飞散后会有一种“先被冲出去、再被热浪托着飘一会儿、最后慢慢落下”的节奏感。4.3 碰撞要不要让纸片落地这是我在做这期内容时反复纠结的一个点。理论上纸片在1到2秒的生命周期里肯定会有部分粒子碰到地面如果完全不处理碰撞粒子会直接穿模到地下非常露馅。但用Niagara Collision模块也有副作用碰撞计算有成本而且如果场景碰撞体复杂粒子的碰撞行为可能不符合预期。我的做法是加一个简单的Plane Collision平面碰撞直接给一个Collision Plane放在击点下方10厘米左右的位置。这样纸片落地后会被平面阻挡产生一个“弹跳并停留”的效果。碰撞参数设置如下Restitution恢复系数设为0.2让纸片落地时有轻微的反弹但不会像弹球那样乱跳。Friction摩擦力设为0.8保证纸片落在平面上后会迅速停止滑动。碰撞后的速度阈值设为50低于该速度直接静止省得每帧还要计算摩擦。这个平面碰撞方案在大多数场景都够用——闪电击中的通常是平地或楼顶一个平面就覆盖了90%的情况。如果你的场景有复杂地形如山坡、屋顶斜坡那再额外加场景碰撞体也不迟。5. 与第一期闪电主干合体时间同步、亮度匹配与整体演出节奏5.1 触发方式的正确对接第一期做的闪电主干是个非常短的爆发型特效电弧从击点向上延伸持续约0.2到0.4秒就消失。这期纸片发射器的触发方式必须和闪电主干严格同步只有闪电出现的那一帧才生成纸片。我在Niagara里把纸片发射器的触发类型从“循环”改为“按需播放”。具体操作是在Emitter属性里关闭Looping然后在粒子生成阶段使用一个自定义的布尔参数比如叫“TriggerFlash”来控制Spawn模块。当闪电击中的某一帧外部蓝图或动画通知会把TriggerFlash置为true纸片发射器接收到信号后执行Spawn Burst Instantaneous一次性生成40枚粒子。这个同步逻辑听起来简单但有一个坑如果电弧的播放频率很高比如连闪好几次每一次击闪都会触发纸片生成纸片发射器必须在每次触发后清空上一次的粒子否则粒子上限会累积爆炸。我在Update阶段加了一个“如果粒子年龄超过最大生命周期2.8秒则移除”的规则确保第二批纸片生成时第一批已经完全消失不会互相叠加。5.2 颜色与光强匹配纸片要被闪电“染上色”纸片材质里的主色和闪电电弧的颜色必须来自同一个色彩体系。我第一期闪电主干用的基色是中心色纯白RGB 1.0, 1.0, 1.0中间过渡淡蓝色RGB 0.6, 0.8, 1.0外圈晕染紫色RGB 0.5, 0.3, 0.8但纸片的颜色如果完全照抄电弧的主色会显得很假——人家纸片是环境物体不是光源本身它应该反射的是闪电的环境光而不是自己发光到那种程度。所以我调整了纸片的颜色映射逻辑纸片基础颜色主体为泛黄的米白色模拟普通纸张本色然后混合一个淡蓝色调作为闪电反光。具体做法是在材质里用粒子属性里的碰撞法线和朝向信息去混合两个颜色粒子生成后0到0.2秒内反光强度最高被闪电直接照亮的瞬间之后快速衰减到30%保留一点微光。亮度匹配方面要注意的是闪电电弧的Emissive强度通常在5到10之间经Bloom处理后会非常亮。纸片的发光强度不需要和电弧对齐只需要保证在电弧出现的同一帧纸片颜色能明显“亮一下”。我在粒子系统里用一个自定义浮点变量“LightBurst”控制闪电触发的头三帧内LightBurst从0跳到1然后指数衰减到0.2。这个变化反映在材质里就是纸片瞬间被点亮然后缓缓冷却。5.3 深度与遮挡让纸片融入场景而不是浮在屏幕上还有一个细节容易被忽略纸片飞散在空间里有些会飞到摄影机和闪电之间有些会被场景物体遮挡。如果纸片没有处理遮挡关系大概率会看到纸片穿模显示在最前面把闪电阻断了。Sprite Renderer支持深度测试默认是开启的。但我发现有些情况纸片还是会穿透显示——问题出在透明混合模式上同一Emitter内部粒子之间如果有透明穿插渲染排序可能会出bug。解决办法有两个第一开启Sprite Renderer的“Sort Only By Depth”选项让它按深度排序而不是按生成顺序。第二在材质里把纸片的透明排序类型设为“Distance to Camera”保证纸片不会因为粒子年龄带来的混合优先级而错误遮挡闪电主干。实际测试下来纸片在世界空间中飞行时和被击物体的遮挡关系表现良好偶尔有纸片落在相机正前方挡住电弧的情况——那是合理的现实中也有碎纸片从镜头前飞过的体验反而增加了临场感。6. 复现与微调我踩过的坑和针对不同帧数的调参策略6.1 三个常见坑转速过高、生命周期过短、发射太均匀做这套粒子系统的过程中我踩了不少坑挑三个最典型的分享一下帮大家节约时间。第一个坑是转速过高导致纸片“糊”成圆环。前面提过角速度范围设太大片子转太快整个粒子看起来就像一个旋转的光圈完全看不出纸片轮廓。要解决这个问题角速度别超过540度每秒最好压在360左右同时配合材质里的方向性高光条纹让旋转有可感知的方向参照物。第二个坑是生命周期太短导致纸片飘不到半路就消失。闪电电弧只有零点几秒很容易让人误以为纸片生命周期也要跟着缩短。实际上纸片作为环境反馈需要持续1到2秒才能让观众感知到“闪电已经结束碎片还在飘落”的余韵。我第一次设0.7秒结果电弧熄灭后纸片也瞬间消失视觉上感觉“能量瞬间被抽走”非常突兀。后来调到1.5到2.5秒之后整个特效的余韵感就有了。第三个坑是初始速度范围太均匀所有纸片飞出去的距离差不多会在击点周围形成一个“标准圆形纸片环”非常滑稽。解决方式是把初始化速度改为非均匀分布比如70%的粒子速度落在300到600区间20%在600到90010%在900到1200。可以用“分布”类型里的“Uniform”或者“Curve”控制不同速度段的概率。这样纸片飞散的半径会有明显远近层次更像真实的爆炸抛洒。6.2 特效时长与帧率敏感参数纸片粒子的角速度、速度衰减、拖拽曲线这些参数帧率不同时表现会不一样。比如游戏跑30帧时每帧的计算间隔是33毫秒粒子每帧前进的距离更大同样的速度参数下纸片会显得比60帧时飞得更远、转得更快。为了尽量规避这个问题我有几个策略第一所有依赖时间的曲线如拖拽曲线、颜色衰减曲线都用绝对时间轴0到2秒而不是用粒子年龄百分比。这样帧率波动时曲线形状不会走样。第二角速度计算尽量用弧度制固定步长我在Niagara里用“Sprite Angular Velocity”模块时直接指定单位是度每秒确保不同帧率下单位时间旋转角度一致。第三如果是出影视级别的离线渲染直接锁定30帧或者24帧去调试参数别在60帧下调完又切成30帧那样纸片飘落速度会有肉眼可见的差异。6.3 一个实战微调案例从“能看”到“好看”最后分享一个调参案例供参考。朋友拿这套纸片系统做“闪电击中城市街道”的场景他反馈纸片在白天场景下几乎看不见发光的纸片被日光完全吞掉。我建议他把纸片材质改成“白天模式”和“夜晚模式”两个分支用材质参数集合控制。白天模式的纸片基础颜色加深模拟被阳光晒旧的白纸反光强度降低同时加一个环境光遮蔽节点让纸片背光面看起来是暗灰色的。夜晚模式保持原来的自发光和辉光思路。白天模式下纸片的数量也相应从40提到80因为纸片在亮环境里视觉权重变小要靠数量撑起层次。他还给白天的纸片加了影子的功能用的是材质里“接收阴影”选项把纸片设为可以接收场景阴影的关键帧。白天场景下纸片落到地面上会被建筑阴影遮住一部分真实感立刻上一个档次。这个调整只花了半小时但成品效果比我原版在夜晚场景下的表现还要抢眼。7. 扩展思路旋转纸片还能玩出什么花样这期做的是闪电特效中的纸片碎片但“旋转粒子”的思路完全可以移植到其他特效场景。我在测试过程中发现这套系统的参数框架稍微改一改就能做出完全不同的视觉内容。比如把粒子贴图换成金黄色的圆形光斑角速度保持高速配合发光材质就能变成“电火花飞溅”的效果——闪电击中金属物时火花四溅的轨迹本质上就是大量高速旋转的高亮粒子。再把力场从重力改为径向向外扩散还可以模拟车辆爆炸时飞溅的火星。把贴图换成细长条状材质用半透明加明亮白色粒子旋转时会产生闪烁的光条效果这就是“能量碎片”的常用做法——很多魔法技能特效里的流光碎片就是这么做的。再叠加一个螺旋形的湍流扰动场纸片粒子的轨迹会呈现螺旋状扩散适合做传送门、时空裂缝之类的科幻效果。如果你有编辑骨骼网格体资产的经验还可以把Sprite Renderer换成Mesh Renderer用真正的纸片模型替换Sprite再把角速度映射到模型的根骨骼运动上这样粒子本身会有视野深度变化在VR或全景项目中效果会更好。不过常规的屏幕空间特效我仍然推荐用Sprite方案——够快、够省、效果完全够用。到现在这套旋转纸片系统已经是完整可用了。我做项目时习惯在粒子系统里加一个总控参数集把数量、速度、旋转速度、发光强度这些暴露到外部方便后期策划或者美术在Key帧时实时调整不需要频繁进Niagara编辑器改内部逻辑。这个习惯在项目交付时特别重要——不是我自夸能在引擎里给美术留调参接口比给一整套不可动的特效省下非常多联调时间。