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

上周有位学员在群里发了个录屏:他做的盾牌格挡特效像一层薄薄的塑料膜被戳破,完全没有“哐当”一声的厚重感。这其实是很多新手在 UE5 特效中常见的痛点——格挡特效不仅需要视觉上的冲击,更需要物理逻辑的支撑:能量怎么反弹?碎片往哪飞?衰减曲线怎么调?今天我们就用 Niagara 系统,从零搭建一个带能量反弹和碎片飞溅的盾牌格挡特效。

一、核心原理:Niagara 中的碰撞与发射逻辑

在 UE5.3 版本中,Niagara 的碰撞检测已经非常成熟。但很多同学直接套用默认的 Collision 模块,导致反弹方向千篇一律。盾牌格挡的核心在于:能量波必须沿着盾牌法线方向反弹,而碎片则需要根据碰撞点随机散射

1.1 创建基础发射器

打开 Niagara 编辑器,新建一个 `Niagara Emitter`,命名为 `Shield_Block_Impact`。关键参数设置:

  • Spawn Rate:设为 `0`(我们不希望持续发射,而是通过外部触发)
  • Initialize Particle:`Lifetime` 设为 `0.5~1.2` 秒(随机范围),`Sprite Size` 设为 `10~30` 单位
  • 接着在 `Particle Spawn` 阶段添加一个 `User Exposed` 参数 `ImpactNormal`(Vector3),这个参数会从蓝图传入盾牌碰撞点的法线方向。

    1.2 能量反弹模块

    在 `Particle Update` 中添加 `Collision` 模块,关键设置:

  • Collision Mode:`Physics`(物理碰撞,比 `Depth Buffer` 更准)
  • Restitution:`0.6~0.8`(反弹系数,能量波需要更高反弹)
  • Friction:`0.05`(降低摩擦力,让能量波滑出去)
  • 但默认碰撞会让粒子沿入射角反射,我们需要强制沿法线方向反弹。解决方案:在碰撞事件中绑定自定义 `OnCollision` 事件,然后修改粒子速度:

    // 在 Collision 模块的 OnCollision 事件中
    Particles.Velocity = Normalize(ImpactNormal) * 500; // 500 是初始速度
    Particles.Color = FLinearColor(0.2, 0.8, 1.0, 1.0); // 冰蓝色能量
    

    这样能量波会从碰撞点沿法线方向射出,配合 `Lifetime` 内的 `Scale Color` 模块(Alpha 从 1 衰减到 0),形成一道扩散的能量环。

    能量反弹示意图

    二、碎片飞溅:从随机散射到物理模拟

    能量反弹只是第一步,真正的反馈感来自碎片。碎片需要满足三个条件:数量足够多、方向随机、有物理碰撞

    2.1 碎片发射器配置

    新建第二个发射器 `Shard_Debris`,使用 `GPU Compute` 模式(碎片数量多时性能更好)。关键参数:

  • Spawn Rate:`20~30` 个粒子/次
  • Initialize Particle:`Lifetime` 设为 `0.8~2.0` 秒,`Mesh` 选择简单的 `Cube`(可替换为碎玻璃模型)
  • Initial Velocity:使用 `Random Range`,X/Y/Z 范围设为 `-300~300`,但需要排除法线方向(否则碎片会穿透盾牌)
  • 2.2 法线排除技巧

    在 `Particle Spawn` 中添加 `User Exposed` 参数 `ImpactNormal`,然后通过 `Vector Length` 和 `Dot Product` 过滤:

    // 计算速度方向与法线的夹角
    float Dot = dot(Normalize(Particles.Velocity), ImpactNormal);
    if (Dot > 0.6) // 如果夹角小于53度,说明速度方向太接近法线
    {
        Particles.Velocity = Reflect(Particles.Velocity, ImpactNormal); // 反射出去
    }
    

    这样碎片不会朝盾牌内部飞,而是沿着盾牌表面散射。接着添加 `Gravity` 模块,`Gravity Scale` 设为 `0.3`(让碎片有下落感但不会立即坠地)。

    2.3 碰撞与二次碎片

    碎片也需要碰撞,但反弹系数要低(`Restitution = 0.2`),模拟碎片撞击地面后碎成更小的颗粒。在 `OnCollision` 事��中,可以 `Spawn Burst` 额外生成 2~3 个更小的粒子(`Size = 5~10`),颜色变深,模拟灰尘或粉末。

    碎片飞溅效果

    三、蓝图触发与材质优化

    特效在 Niagara 里做好了,还需要在蓝图中正确触发。这里分享一个最佳实践:不要直接调用 `SpawnEmitter`,而是用 `Niagara Component` 的 `Set Variables` 动态更新参数。

    3.1 蓝图事件绑定

    在第三人称角色的 `AnimBlueprint` 中,添加 `Event Montage` 节点,在格挡动画播放到撞击帧时触发:

    // 蓝图逻辑
    1. 获取盾牌碰撞体的世界位置与法线
    2. 创建 Niagara Component(Attach to 盾牌骨骼)
    3. 调用 Set Vector Parameter: ImpactNormal = 碰撞法线
    4. 调用 Set Vector Parameter: ImpactPoint = 碰撞点世界坐标
    5. 激活发射器(Activate System)
    

    注意:`ImpactNormal` 需要在 Niagara 中设置为 `User Exposed`,并且数据类型匹配(Vector3)。如果盾牌是静态网格体,可以用 `Get Hit Result Under Cursor` 获取法线。

    3.2 材质优化:半透明能量与金属碎片

    能量环的材质建议使用 Unlit 模式,配合 `Time` 节点做扭曲效果:

  • Base Color:使用 `Hue Shift` 随时间变化(0.5~0.7 蓝色区域)
  • Opacity Mask:用 `Texture Coordinate` 的 `UV` 偏移实现流动感
  • Emissive Color:强度设为 `5~10`,配合 `Bloom` 产生光晕
  • 碎片材质则用 `Lit` 模式,`Roughness` 设为 `0.3`,`Metallic` 设为 `0.8`,模拟金属碎片的高光。如果希望碎片带能量残留,可以在 `Emissive` 通道叠加一个 `Noise` 纹理。

    材质参数面板

    四、性能与细节优化

    很多同学做完发现帧率暴跌,尤其是碎片数量超过 50 个时。这里有几个优化技巧:

    1. LOD 设置:碎片距离摄像机超过 10 米时,自动切换为 `Sprite` 渲染(粒子变成贴片),减少网格渲染开销。
    2. Pooling 机制:在 Niagara 中启用 `Emitter Pool`,避免频繁创建销毁发射器。
    3. 碰撞层级:碎片只与 `WorldStatic` 和 `WorldDynamic` 碰撞,忽略角色自身(否则会产生自碰撞导致碎片乱飞)。
    4. 声音同步:在 `OnCollision` 事件中通过 `Play Sound 2D`(或 `Spawn Sound`)播放金属碰撞声,增强反馈。

    常见问题 FAQ

    Q1:能量反弹时粒子直接穿透地面怎么办?
    A:检查 Collision 模块的 `Collision Channel`,确保设置为 `WorldDynamic` 和 `WorldStatic`。另外,`Restitution` 值过高(>0.9)会导致粒子速度不减,容易穿透薄网格。建议保持在 0.6~0.8。

    Q2:碎片数量一多就卡顿,如何平衡?
    A:使用 `GPU Compute` 发射器,并限制最大粒子数(Max Particles = 200)。同时启用 `LOD`,根据屏幕尺寸减少碎片生成量。如果还卡,考虑将碎片 Mesh 替换为 `Sprite`(用贴图模拟碎片形状)。

    Q3:为什么我的法线参数传进去没效果?
    A:确认蓝图中的 `Set Vector Parameter` 名称与 Niagara 中的 `User Exposed` 参数名称完全一致(区分大小写)。另外,法线需要归一化(Normalize),否则方向会偏移。

    Q4:如何让能量环有扩散动画?
    A:在 Niagara 的 `Particle Update` 中,使用 `Scale Sprite Size` 模块,将 `Size` 与 `Particle Age` 关联(例如 `Size = 10 + Age * 200`)。同时配合 `Color` 模块的 Alpha 衰减,形成扩散消失效果。

    Q5:格挡特效能否应用在非玩家角色上?
    A:可以。将 Niagara 组件挂在敌人的盾牌骨骼上,通过 `Event Dispatcher` 从伤害事件触发。注意调整 `ImpactNormal` 的计算方式——敌人的盾牌法线需要根据攻击方向动态计算。

    总结与进阶建议

    盾牌格挡特效的本质是物理反馈的视觉化。Niagara 的优势在于你可以精确控制每个粒子的行为:碰撞方向、速度衰减、二次生成。如果你想让特效更上一层楼,可以尝试以下方向:

    1. 冲击波纹理:用 `Render Target 2D` 实时渲染能量环的扩散纹理,再贴到地面网格上,形成地面裂纹效果。
    2. AI 粒子决策:让碎片根据撞击角度决定是否产生火花(高速碰撞触发火花,低速碰撞只产生碎片)。
    3. 多层级反馈:能量反弹 + 碎片 + 屏幕震动(`Camera Shake`)+ 慢动作(`Global Time Dilation`),形成完整的打击感闭环。

    最后提醒一句:特效不是越炫越好,而是越合理越好。玩家看到能量沿法线反弹、碎片按物理规律飞溅,潜意识里就会觉得“这个盾牌是真的”。下次遇到特效反馈不够的问题,不妨先从碰撞逻辑入手调试。

    如果你在实际操作中遇到参数调不通的情况,欢迎在评论区贴出你的 Niagara 截图,我会帮你诊断。

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