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

上周在火星人教育的 UE5 特效进阶班上,学员小李拿着一个盾牌格挡的 Demo 来找我:“老师,我做了个能量护盾,但格挡时只有光晕闪烁,完全没有‘碰撞感’——敌人攻击打上来,盾牌既没有碎片飞溅,也没有能量反弹的轨迹,感觉像在打空气。” 这个问题非常典型。很多特效师在做防御类技能时,容易陷入“只做受击特效”的误区,忽略了格挡动作本身应该产生的物理反馈和能量交互。

今天,我们就用 Unreal Engine 5.4 的 Niagara 系统,从零搭建一个具备“能量反弹 + 碎片飞溅”的盾牌格挡特效。整个过程会涉及两个核心案例:一是基于碰撞检测的粒子反弹逻辑,二是基于物理材质的碎片生成系统。准备好你的 UE5 项目,我们直接切入技术细节。

一、能量反弹:基于 Niagara 的碰撞检测与轨迹重定向

格挡特效的核心在于“方向性”。当敌人的火球或箭矢撞击盾牌时,能量不应该直接消散,而应该沿着法线方向反弹出去。UE5 自带的 Niagara 碰撞模块可以轻松实现这一点,但需要调整几个关键参数。

1.1 创建反弹粒子发射器

在 Content Browser 中右键 → FX → Niagara Emitter,选择模板为 `Simple Sprite Burst`。命名为 `N_Shield_Deflect`。打开 Niagara Editor 后,按以下步骤操作:

步骤 1:设置粒子生命周期与初始速度

  • 在 `Emitter Spawn` 模块中,将 `Spawn Rate` 设为 0(我们通过蓝图触发),`Spawn Per Unit` 设为 0。
  • 添加 `Add Velocity` 模块,将 `Velocity` 的 `Vector` 设为 `(0,0,0)`,后续通过蓝图传入方向。
  • 在 `Particle Spawn` 中,添加 `Scalar Uniform Random` 控制 `Lifetime`,范围设为 0.3-0.8 秒,让粒子有大小差异。
  • 步骤 2:启用碰撞与反弹

  • 在 `Particle Update` 中,添加 `Collision` 模块。这是关键:
  • – `Collision Mode` 选 `Physics`(物理碰撞),而非默认的 `Simulation`。
    – `Collision Channel` 设为 `WorldStatic` 和 `WorldDynamic`,确保粒子能撞到场景物体。
    – `Bounce Restitution`(反弹弹性)设为 0.8-1.0,模拟能量不衰减的反弹。
    – `Friction` 设为 0,避免粒子因摩擦减速。

    步骤 3:添加方向性轨迹
    为了让粒子沿法线方向反弹,我们需要在 `Collision` 模块的 `On Collision Event` 中,读取碰撞法线并重定向速度。

  • 在 `Particle Update` 中,添加 `Event Handler`,类型选 `Collision`。
  • 在 `On Collision` 脚本中,写入��下逻辑(伪代码):
  •   Vector HitNormal = CollisionInfo.Normal;
      Particle.Velocity = reflect(Particle.Velocity, HitNormal) * 0.9;  // 保留90%速度
      

    UE5 的 Niagara 脚本节点中,可以直接使用 `Reflect Vector` 节点,输入 `Velocity` 和 `Normal` 即可。

    1.2 在蓝图中触发反弹

    回到主场景,创建一个蓝图类 `BP_Shield`,添加一个 Box Collision 作为盾牌碰撞体。在 `Event Hit` 节点中,获取碰撞点位置和法线,然后生成 Niagara 特效:

    // 获取碰撞信息
    Vector HitLocation = Hit.ImpactPoint;
    Vector HitNormal = Hit.ImpactNormal;

    // 生成 Niagara 系统 UNiagaraComponent* DeflectFX = Spawn Niagara System at Location(HitLocation); DeflectFX->SetVectorParameter("User.HitNormal", HitNormal); DeflectFX->SetVectorParameter("User.SpawnDirection", GetActorForwardVector()); // 盾牌朝向

    注意:Niagara 中需要提前暴露 `HitNormal` 和 `SpawnDirection` 作为 User 参数。在 Niagara Editor 的 `Parameters` 面板中,新建两个 `Vector` 类型的 User 参数,然后在 `Particle Spawn` 中利用它们计算初始速度方向。

    效果验证:当子弹碰撞盾牌时,粒子会沿法线方向呈扇形反弹,且每颗粒子会持续与场景碰撞反弹,形成类似“能量涟漪”的轨迹。
    Niagara碰撞反弹设置

    二、碎片飞溅:基于物理材质与网格体生成

    能量反弹解决了“方向感”,但缺乏“质感”。真正的盾牌格挡应该有碎片飞溅——比如金属碎片、能量结晶碎块。UE5 的 Niagara 支持直接生成 Static Mesh 粒子,配合物理材质,可以实现真实的物理破碎效果。

    2.1 设置碎片网格体与物理材质

    首先准备碎片模型:在 Blender 或 Maya 中制作 3-4 个不规则多面体(类似碎玻璃或金属片),导出为 FBX 并导入 UE5。每个碎片大小控制在 10-20 厘米,面数尽量低(<100 面),因为 Niagara 会大量实例化。

    物理材质设置

  • 创建一个 `Physical Material`,命名为 `PM_Shard`。
  • `Friction` 设为 0.3,`Restitution` 设为 0.2(碎片落地后不会弹太高)。
  • 在碎片的 Static Mesh 中,将 `Physical Material` 覆盖为该材质。
  • 2.2 创建碎片生成发射器

    新建 Niagara Emitter,模板选 `Simple Mesh Burst`。命名为 `N_Shield_Shards`。

    步骤 1:网格体与碰撞配置

  • 在 `Renderer` 中,`Render Type` 选 `Mesh`,`Mesh` 选择你导入的碎片模型。
  • 在 `Particle Spawn` 中,添加 `Mesh Rotation` 模块,让碎片随机旋转:`Rotation` 设为 `Random Vector`,范围 `(0,360)`。
  • 添加 `Collision` 模块,参数与之前类似,但 `Bounce Restitution` 设为 0.2-0.3,模拟硬质碎片的低弹性。
  • 步骤 2:速度与分布控制

  • 在 `Particle Spawn` 中,添加 `Sphere Location` 模块作为初始位置(半径 5-10 厘米,集中在碰撞点)。
  • 添加 `Add Velocity` 模块,方向使用球面随机:`Sphere Distribution` 设为 `Uniform`,速度范围 200-600 cm/s。
  • 为了让碎片有“爆炸感”,添加 `Scalar Uniform Random` 控制 `Mass`(质量),范围 0.5-2.0,质量小的碎片飞得更远。
  • 步骤 3:生命周期与衰减

  • 粒子 `Lifetime` 设为 1.0-3.0 秒。
  • 在 `Particle Update` 中,添加 `Scale Color` 模块,让碎片在最后 0.5 秒逐渐淡出(Alpha 从 1 降到 0)。
  • 添加 `Scale Mesh Size` 模块,初始大小 1.0,结束时缩放到 0.3,模拟碎片消散。
  • 2.3 与能量反弹特效联动

    在 `BP_Shield` 中,同时生成两个 Niagara 系统:

  • 反弹粒子:沿法线方向高速射出。
  • 碎片飞溅:在碰撞点周围随机分布。
  • 为了提升真实感,可以添加一个 `Spawn Burst` 模块:在碰撞瞬间生成 10-20 个碎片,后续 0.2 秒内再生成 5-10 个(模拟二次碎裂)。
    碎片飞溅效果

    三、性能优化与进阶技巧

    3.1 LOD 与粒子数量控制

  • 对于移动端或低配 PC,限制碎片最大数量为 30 个,反弹粒子为 50 个。
  • 在 Niagara 的 `Emitter State` 中,设置 `Max Particles` 上限。
  • 使用 `Distance Culling`:当摄像机距离超过 15 米时,关闭发射器。
  • 3.2 材质与光照增强

  • 反弹粒子可以使用 `SubUV` 动画,配合 `Translucent` 材质,制作能量拖尾效果。
  • 碎片材质中添加 `Roughness` 和 `Metallic` 参数,配合动态光照(如点光源闪烁),让碎片看起来更“硬”。
  • 在 `BP_Shield` 中,碰撞时触发一个 `Point Light` 闪烁 0.1 秒,光强度 5000-10000,颜色与能量色调匹配。
  • 3.3 音效与屏幕震动

  • 在 `Event Hit` 中播放 `Sound Cue`:金属碰撞声 + 能量嗡鸣。
  • 调用 `Player Camera Manager` 的 `Play Camera Shake`,振幅 0.3,频率 0.5 秒,增强打击感。
  • 最终效果展示

    总结与进阶建议

    通过以上两个案例,我们解决了“格挡没有碰撞��”的核心问题:能量反弹提供了方向性轨迹,碎片飞溅增加了物理质感。在实际项目中,你还可以进一步扩展:
    1. 将反弹粒子与敌人技能联动——例如反弹的火球直接改变方向,返回攻击敌人。
    2. 使用 `Niagara Data Interface` 读取骨骼网格体的碰撞数据,实现更精准的盾牌边缘反弹。
    3. 结合 `Chaos Physics` 生成可交互的碎片,让玩家可以捡起或踩碎。

    学习建议

  • 动手前,先分析 3A 游戏中的格挡特效(《战神》《只狼》),注意它们的粒子数量、颜色变化和碎片形状。
  • 在 Niagara 中多用 `Debug Visualization`(按`~`键打开控制台,输入 `fx.Niagara.Debug 1`),实时查看粒子碰撞体。
  • 性能永远是第一位的:优先用 Sprite 模拟碎片,必要时再替换为 Mesh。
  • 常见问题 FAQ

    Q1:粒子碰撞后直接穿透地面,不反弹怎么办?
    A:检查碰撞通道设置。在 `Collision` 模块中,确保 `Collision Channel` 包含了 `WorldStatic`(地面),且 `Bounce Restitution` 不为 0。如果使用 `Physics` 模式,还需确认场景物体的 `Collision Enabled` 已开启。

    Q2:碎片飞溅时,所有碎片都朝同一个方向飞,没有随机性?
    A:在 `Add Velocity` 模块中,将 `Distribution` 改为 `Sphere Distribution`,并确保 `Random Seed` 在 `Emitter Spawn` 中设置了随机化。或者,使用 `Vector From Angle` 节点,结合 `Random Float` 生成方向。

    Q3:Niagara 特效在蓝图里生成后,瞬间消失?
    A:可能是 `Lifetime` 太短或 `Spawn Rate` 为 0 导致。检查 `Emitter State` 中的 `Life Cycle Mode`,设为 `Self`,并确保 `Particle Spawn` 中有有效的 `Spawn Burst` 或 `Spawn Rate` 值。

    Q4:碎片网格体在游戏中显示为白色方块?
    A:碎片 Static Mesh 的材质未正确设置。确保碎片模型有有效的材质球,且在 Niagara Renderer 中,`Material` 参数已绑定对应材质。如果使用 `Simple Mesh Burst` 模板,默认会使用 `Default Mesh Material`,需要手动覆盖。

    Q5:如何让反弹粒子带有拖尾效果?
    A:在 Niagara 中添加 `Trail` 渲染器。在 `Renderer` 中添加 `Ribbon` 或 `Beam` 类型,将 `Trail Mode` 设为 `Particle`,并设置 `Trail Length`(如 0.3 秒)。粒子的颜色和大小会沿轨迹渐变,形成能量拖尾。

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