# 游戏盾牌格挡特效:用 Niagara 模拟能量反弹与碎片飞溅

去年在火星人教育带的一个手游项目中,有个学员做了个盾牌格挡特效,结果被主策打回三次——能量反弹像“软绵绵的棉花糖”,碎片飞溅像“天女散花”。问题出在哪儿?他用了默认的粒子系统,没有利用 Niagara 的碰撞查询和动态参数传递。今天我们就用 UE5.3+Niagara 系统,从零构建一个能“弹飞子弹”的盾牌格挡特效。

一、Niagara 核心逻辑:从“被动发射”到“主动碰撞”

在传统粒子系统中,粒子发射后只能“听天由命”——碰到场景就消失或反弹。但在 UE5.3 的 Niagara 中,我们可以通过 Collision QueryEvent Handler 让粒子“主动”感知碰撞,并触发新粒子的生成。

1.1 创建基础盾牌格挡发射器

操作路径:内容浏览器右键 → Niagara System → 选择“Empty System” → 添加“Fountain”发射器模板。

关键参数设置

  • 发射器更新:将 `Emitter.SpawnRate` 设为 0(不自动发射),改为通过 `Spawn Burst Instantaneous` 在需要时触发。
  • 粒���更新:添加 `Collision Query` 模块,设置 `Collision Channel` 为 `WorldStatic`,`Trace Channel` 为 `Visibility`。
  • 粒子生成:使用 `Spawn Particles` 事件,在碰撞点生成“碎片发射器”。
  • 实操小练习 1
    1. 在 Niagara 编辑器中打开新创建的发射器,点击“+”添加 `Collision Query` 模块。
    2. 设置 `Collision Mode` 为 `Query Only`,`Query Type` 为 `Sphere`(半径0.5)。
    3. 在 `On Collision` 事件中,添加 `Spawn Particles` 节点,连接一个子发射器(如 `NS_Shard`)。
    4. 在细节面板中,将 `Spawn Rate` 设为 200,`Lifetime` 设为 0.5-1.0秒。
    5. 按 `Ctrl+S` 保存,拖入场景测试——此时粒子碰到地面才会生成碎片。

    1.2 能量反弹的物理模拟

    反弹效果的核心是 VelocityNormal 的向量运算。当粒子碰撞时,我们需要计算反射方向,并重置粒子速度。

    节点配置

  • 在 `Collision Query` 的 `On Collision` 事件中,获取 `Collision Normal`。
  • 使用 `Vector Math` 节点计算反射向量:`Reflect(Velocity, Normal)`。
  • 将计算后的速度赋值给粒子的 `Particles.Velocity`。
  • 参数调优

  • `Bounciness`(弹性系数):设为 0.6-0.8,避免能量完全保留导致无限反弹。
  • `Friction`(摩擦系数):设为 0.1,让反弹后速度略微衰减。
  • `Collision Radius`:设为 2.0,避免粒子卡在模型缝隙中。
  • 实操小练习 2
    1. 在 `On Collision` 事件中,拖入 `Get Collision Normal` 节点。
    2. 添加 `Vector Math` 节点,选择 `Reflect` 模式,连接 `Particles.Velocity` 和 `Normal`。
    3. 添加 `Multiply` 节点,将反射速度乘以 0.7(能量衰减系数)。
    4. 用 `Set Particles.Velocity` 节点赋值。
    5. 按 `Ctrl+Shift+~` 打开控制台,输入 `niagara.Debug 1` 查看粒子轨迹。

    二、碎片飞溅:从“随机”到“可控”的爆发

    很多学员做碎片飞溅时,直接使用 `Sphere Location` 加随机速度,结果碎片像“爆炸后的灰尘”——没有方向性。真正的格挡碎片应该沿着盾牌表面法线方向飞散。

    2.1 基于碰撞点的碎片生成

    操作路径:创建新发射器 `NS_Shard` → 添加 `Cylinder Location` 模块 → 启用 `Align to Normal`。

    核心逻辑

  • 在盾牌格挡触发时,通过 `Spawn Burst Instantaneous` 在碰撞点生成碎片。
  • 使用 `Get Collision Info` 节点获取碰撞点的 `Normal` 和 `Position`。
  • 碎片速度方向 = 法线方向 + 随机扰动(使用 `Random Vector` 节点,范围 -45°到+45°)。
  • 参数设置

  • `Spawn Count`:20-30个碎片(根据盾牌大小调整)。
  • `Lifetime`:0.3-0.8秒,配合 `Particle Size` 的 `Curve` 实现“从小变大再消失”。
  • `Velocity`:基础速度 500-800,加上 `Random Range`(-200到200)。
  • 实操小练习 3
    1. 在 `NS_Shard` 的 `Particle Spawn` 阶段,添加 `Set Velocity` 模块。
    2. 使用 `Normalize` 节点处理碰撞法线,乘以基础速度 600。
    3. 添加 `Random Vector in Cone` 节点,`Cone Half Angle` 设为 30°,`Length` 设为 200。
    4. 将两个向量相加,赋值给 `Particles.Velocity`。
    5. 在 `Particle Update` 中,添加 `Drag` 模块,`Drag Coefficient` 设为 2.0,模拟空气阻力。

    2.2 碎片材质与动态颜色

    碎片不能只是灰色方块。我们需要根据盾牌材质类型(金属、能量、水晶)动态切换颜色。

    材质实例

  • 创建 `Material Instance` 继承自 `M_Shard`,暴露 `Color` 和 `Roughness` 参数。
  • 在 Niagara 中,通过 `Set Material Parameter` 节点传递颜色值。
  • 参数传递

  • 在 `NS_Shard` 的 `Particle Spawn` 中,添加 `Set Material Instance Parameter`。
  • `Parameter Name` 设为 `Color`,值来自 `Emitter.Color`(在主发射器中设置)。
  • 使用 `Random Range` 让每个碎片颜色有微小差异(±0.1的HSV偏移)。
  • 配图1: Niagara Collision Query 节点配置

    三、实战案例:制作“能量盾牌”格挡效果

    现在我们来做一个完整的案例:当角色举起能量盾牌时,受到攻击会触发蓝色能量反弹和金属碎片飞溅。

    3.1 盾牌碰撞检测与触发

    蓝图配置

  • 在角色蓝图中,添加 `Box Collision` 组件作为盾牌碰撞体。
  • 在 `On Component Hit` 事件中,获取击中的 `Impact Point` 和 `Impact Normal`。
  • Niagara 参数传递

  • 创建 `Niagara Parameter Collection`,存储 `HitLocation`、`HitNormal`、`ShieldColor`。
  • 在蓝图中调用 `Set Niagara Variable` 传递参数。
  • 操作路径
    1. 打开角色蓝图,选择盾牌碰撞体,在事件图表中添加 `On Hit` 节点。
    2. 从 `Hit` 引脚拖出 `Break Hit Result` 节点,获取 `ImpactPoint` 和 `ImpactNormal`。
    3. 创建 `Set Niagara Variable (Vector3)` 节点,`Variable Name` 设为 `HitLocation`。
    4. 连接 `ImpactPoint` 到 `Value` 引脚,`ImpactNormal` 同理。

    3.2 多段式特效层

    层1:能量反弹(主发射器)

  • 使用 `Ribbon` 渲染器,模拟能量轨迹。
  • `Ribbon Width` 0.5-1.0,颜色渐变(蓝→白→蓝)。
  • 添加 `Noise` 模块,让轨迹有波动感。
  • 层2:碎片飞溅(子发射器)

  • 使用 `Sprite` 渲染器,材质为 `M_Shard_Inst`。
  • 添加 `Rotation` 模块,让碎片旋转(速度 500-1000°/秒)。
  • 层3:光晕闪烁(子发射器)

  • 使用 `Mesh` 渲染器,模型为 `Sphere`。
  • `Scale` 从 0.5 到 2.0 再归零(使用 `Curve`)。
  • 颜色透明度从 1.0 到 0.0(使用 `Linear Curve`)。
  • 参数联动

  • 在主发射器的 `Emitter.Spawn` 中,设置 `Emitter.Color` 为 `ShieldColor`。
  • 子发射器通过 `Particle Spawn` 中的 `Get Parent Attributes` 节点继承颜色。
  • 配图2: UE5 Niagara 碎片飞溅效果

    3.3 性能优化与LOD

    关键设置

  • 在发射器细节中,启用 `Cull by Viewport`,`Cull Distance` 设为 2000。
  • 碎片发射器 `Max Particles` 设为 50,避免过量生成。
  • 使用 `Particle Size` 的 `Curve` 让碎片在生命周期后期逐渐缩小。
  • 实操小练习 4
    1. 在 `NS_Shard` 的 `Particle Update` 中,添加 `Scale Color` 模块。
    2. 设置 `Color` 的 `Alpha` 曲线:0.0→1.0→0.0(时间0-0.3秒)。
    3. 添加 `Scale Size` 模块,`Size` 曲线:0.1→1.0→0.0(时间0-0.5秒)。
    4. 在发射器细节中,`Max Particles` 设为 30,`Pool Method` 设为 `Auto`。
    5. 按 `Alt+E` 打开性能分析器,检查 `Particle Draw Calls` 是否控制在 5 以内。

    配图3: Niagara 性能优化参数

    四、常见问题FAQ

    Q1:为什么我的粒子碰撞后直接消失了,没有反弹?
    A:检查 `Collision Query` 模块的 `Behavior On Collision` 是否设为 `Ignore`(默认)。需要改为 `Stop` 或 `Bounce`,并在 `On Collision` 事件中手动设置速度。UE5.3 中,`Bounce` 模式自带速度重置,但最好手动计算反射向量。

    Q2:碎片飞溅方向总是朝向同一个方向,不像随机爆炸?
    A:问题在于 `Random Vector in Cone` 的 `Cone Half Angle` 太小(默认15°)。设到 60°-90° 才能产生扩散效果。另外,确保 `Normal` 是从碰撞点指向外部,而不是内部。

    Q3:如何让碎片材质随盾牌颜色变化?
    A:使用 `Material Instance Dynamic` 或 `Set Material Parameter` 节点。在 `Particle Spawn` 中,添加 `Set Mesh Material Parameter`,`Parameter Name` 设为 `Color`,值从 `Emitter.Color` 获取。注意:材质参数必须暴露为 `Dynamic`。

    Q4:性能太差,一放技能就掉帧怎么办?
    A:三步优化:① 减少 `Max Particles`,碎片控制在 20 个以内;② 使用 `Cull by Viewport` 和 `LOD`;③ 将 `Sprite` 渲染器改为 `Mesh`(使用低多边形模型),减少半透明混合开销。

    Q5:Niagara 系统在打包后不显示特效?
    A:检查 `Project Settings → Niagara → Enable Niagara Plugin` 是否勾选。另外,确保所有使用的材质、模型都已打包(在 `Content Browser` 中右键 → `Asset Actions` → `Force Cook`)。

    五、下一步学习建议

    1. 进阶方向:尝试用 `Niagara Data Interface`(NDI)读取骨骼动画数据,让碎片跟随角色移动。
    2. 实战项目:在第三人称模板中,用 `Animation Blueprint` 的 `Notify` 触发格挡特效。
    3. 资源推荐:Epic 官方示例项目 `Niagara VFX Pack`(UE5.3 兼容版),里面有完整的能量盾牌和反弹逻辑。
    4. 技术深挖:学习 `Niagara Simulation Stages`,可以做出“能量护盾受击后波纹扩散”的效果。

    格挡特效的精髓在于“反馈感”——粒子碰撞的瞬间、碎片飞散的力度、颜色变化的节奏。希望今天的案例能帮你突破“看着像纸片”的困境。如果还有问题,欢迎在火星人教育社区提交你的 `.uasset` 文件,我会在每周四的直播课中逐帧分析。

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。