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

上周在火星人教育的 UE5 特效进阶班上,一位学员拿着他做的盾牌格挡效果问我:“老师,为什么我的粒子一碰到盾牌就穿过去了?我想让它像《战神》里那样,打上去有能量反弹和碎片飞溅,但调了碰撞参数还是没用。”这个问题很典型——很多人以为在 Niagara 里勾个“Collision”就能搞定,却忽略了碰撞模式的选择和子发射器的联动。今天我们就用两个实操案例,彻底解决这个问题。

一、核心思路:Niagara 碰撞与子发射器的配合

在 UE5.3 中,Niagara 提供了两种碰撞模式:CPU 模拟GPU 模拟。对于盾牌格挡这种需要精确表面碰撞和后续碎片的场景,我推荐用 CPU 粒子 配合 Collision Query 模块。原因很简单:GPU 碰撞虽然性能好,但无法在碰撞事件中触发子发射器,而我们需要的就是“碰撞一瞬间生成新粒子”。

版本说明:本文基于 Unreal Engine 5.3.2,Niagara 版本 5.3。如果你用 UE5.4+,部分节点位置可能微调,但逻辑通用。

第一步:设置基础碰撞——让粒���“粘”在盾牌表面

1.1 创建主发射器(能量反弹粒子)

新建一个 Niagara 系统,命名为 `NS_ShieldBlock_Energy`。在发射器属性中:

  • Sim Target:CPU(必须,否则无法使用碰撞事件)
  • Local Space:勾选(让粒子跟随盾牌移动)
  • 1.2 粒子生成参数

    Emitter Spawn 模块中,设置:

  • `SpawnRate`:每帧 20-30 个(根据盾牌大小调整)
  • `Lifetime`:0.5-1.0 秒(随机范围)
  • Particle Spawn 模块中,初始化位置和速度:

  • `Position`:`GetSocketLocation(“ShieldCenter”)`(获取盾牌中心插槽位置)
  • `Velocity`:从盾牌法线方向向外散射。用 `RandomUnitVectorInCone`,锥角 120°,速度 800-1200
  • 粒子初始分布

    1.3 关键:碰撞配置

    Particle Update 中,添加 Collision 模块。参数如下:

  • Collision Mode:`Surface Only`(只检测表面,不检测体积)
  • Collision Channel:`WorldDynamic`(确保只与可破坏物体碰撞)
  • Collision Quality:`High`(提高碰撞精度,避免穿透)
  • Bounce Restitution:0.3(反弹系数,数值越低能量损失越大)
  • Friction:0.1(摩擦力,让粒子在表面滑动一点再弹开)
  • 重点:勾选 `Generate Collision Events`。这是后续触发碎片的关键。

    1.4 测试碰撞

    此时运行游戏,你应该看到粒子从盾牌中心飞出,碰到地面或墙壁后反弹。但注意——粒子可能“粘”在盾牌表面不动,因为碰撞法线方向错误。解决办法:在碰撞后,用 `Collision Normal` 作为新的速度方向,重新计算速度。

    Collision 模块之后,添加一个 User Script,写入:

    if (HasCollisionEvent)
    {
        NewVelocity = CollisionNormal * 500;
    }
    

    这样粒子碰到盾牌后,会沿着法线方向弹回,形成“反弹”效果。

    第二步:碰撞事件触发碎片飞溅

    2.1 创建子发射器(碎片粒子)

    新建一个 Niagara 发射器,命名为 `EM_Shard`。这个发射器专门负责生成碎片。

  • Sim Target:CPU
  • Local Space:不勾选(碎片在场景中独立运动)
  • 2.2 子发射器参数

    Particle Spawn 中:

  • `Position`:从父粒子碰撞点获取(后面会传递)
  • `Velocity`:随机方向,速度 200-600
  • `Lifetime`:1.5-3.0 秒(让碎片缓慢消失)
  • `Mesh Renderer`:使用一个小的立方体或自定义碎片模型(比如 `SM_Shard_01`)
  • 为了让碎片看起来真实,添加 Initial Mesh RotationAngular Velocity,让碎片旋转。

    2.3 在主发射器中调用子发射器

    回到 `NS_ShieldBlock_Energy`,在 Particle Update 中,添加 Spawn Particles 模块。这个模块的作用是:在碰撞事件发生时,生成子发射器的粒子。

    参数设置

  • Emitter:选择 `EM_Shard`
  • Spawn Rate:每次碰撞生成 3-5 个碎片
  • Spawn Location:`CollisionLocation`(从碰撞事件中获取位置)
  • Spawn Rotation:`CollisionNormal` 作为方向参考
  • 子发射器触发设置

    2.4 传递碰撞数据

    这一步容易遗漏。在 Spawn Particles 模块中,需要手动将碰撞事件的数据传递给子发射器。方法:

  • 打开 Spawn Particles 模块的 Advanced 选项
  • Particle Spawn 中,添加 `Set Particle Data` 节点,将 `CollisionLocation` 和 `CollisionNormal` 写入子发射器的自定义属性(如 `User.Position` 和 `User.Normal`)
  • 然后在 `EM_Shard` 的 Particle Spawn 中,读取这些数据:

    Particle.Position = User.Position;
    Particle.Velocity = User.Normal  RandomRange(200,600) + RandomVector()  100;
    

    第三步:优化视觉效果——能量拖尾与材质

    3.1 粒子材质

    能量反弹粒子建议用 半透明发光材质。在材质编辑器中:

  • Base Color:蓝色到青色的渐变(用 `HueShift` 节点随时间变化)
  • Emissive:`Particle.Color` * 5(让粒子发光)
  • Opacity:`Particle.Alpha`(通过粒子的生命周期淡出)
  • 材质混合模式设为 Translucent,光照模式 Unlit

    3.2 添加拖尾

    在 `NS_ShieldBlock_Energy` 中,添加一个 Trail 渲染器。参数:

  • Trail Mode:`Ribbon`(带状拖尾)
  • Width:`Particle.Size * 2`(宽度随粒子大小变化)
  • Texture:一张渐变纹理(中心亮、边缘淡)
  • 拖尾会让能量反弹看起来有“轨迹感”,而不是一个孤立的点。

    3.3 碎片物理模拟

    碎片粒子建议开启 Physics Force 模块,模拟重力:

  • Gravity:-980(标准重力值)
  • Drag:0.5(空气阻力,让碎片减速)
  • 同时添加 Collision 模块(子发射器也要),让碎片掉落到地面后停止运动,而不是穿透。

    最终效果

    总结与进阶建议

    通过以上步骤,我们实现了:
    1. 能量粒子从盾牌中心散射,碰到表面后反弹
    2. 碰撞事件触发子发射器,生成飞溅的碎片
    3. 材质和拖尾增强了视觉冲击力

    进阶方向

  • 多层级碰撞:让碎片再次触发碰撞,生成更小的碎屑(递归子发射器)
  • 基于距离的衰减:粒子离盾牌越远,速度和亮度越低
  • 音效同步:在碰撞事件中调用 `Play Sound at Location`(需要蓝图配合)
  • 性能优化:如果碎片数量多,改用 GPU 模拟,但需要放弃碰撞事件,改用射线检测替代
  • 如果你想让效果更接近 3A 大作,可以研究 Niagara Event HandlerData Interfaces——比如用 `Grid2D` 存储碰撞点,实现“能量盾牌受击后产生涟漪”的效果。火星人教育的 UE5 特效课程中,我们会在进阶模块专门讲这个。

    最后提醒:调试碰撞时,打开 Niagara Debugger(快捷键 `Ctrl+Shift+逗号`),查看碰撞点的位置和法线方向。90% 的穿透问题都是法线计算错误导致的。

    常见问题 FAQ

    Q1:为什么我的粒子碰撞后直接消失了,没有反弹?
    A:检查碰撞模块的 `Bounce Restitution` 是否设为 0。如果为 0,粒子会粘在表面;如果为 1,会无限反弹。建议设 0.3-0.5。另外,确保 `Collision Mode` 是 `Surface Only`,而不是 `Depth Buffer`(后者用于屏幕空间碰撞)。

    Q2:子发射器生成的碎片位置不对,总是偏离碰撞点。
    A:检查数据传递。在 Spawn Particles 模块的 `Particle Spawn` 中,务必用 `Set Particle Data` 节点将 `CollisionLocation` 写入子发射器的 `User` 参数。同时子发射器的 Local Space 必须关闭,否则位置会相对于父发射器偏移。

    Q3:性能太差,帧数掉到 30 以���怎么办?
    A:首要优化是减少粒子数量。主发射器每帧不超过 10 个,碎片每次碰撞不超过 3 个。其次,将碎片模型换成简单的立方体(4 个顶点),不要用高模。如果还卡,改用 GPU 模拟,但需要放弃碰撞事件,改用 `Spawn Burst Instant` 在固定时间生成碎片(牺牲精确性换性能)。

    Q4:粒子穿过了盾牌模型,没有碰撞?
    A:检查盾牌模型的碰撞设置。在模型编辑器中,确保 Collision Preset 设为 `BlockAll` 或 `PhysicsActor`。如果盾牌是蓝图中的组件,检查其碰撞通道是否包含 `WorldDynamic`。另外,Niagara 的碰撞只检测 静态网格体可破坏物体,不检测骨骼网格体(除非开启 `Complex Collision`)。

    Q5:如何让碎片有物理效果,比如掉到地上弹跳?
    A:在子发射器的 Particle Update 中添加 Physics Force 模块(设置重力),再添加 Collision 模块(设 `Bounce Restitution` 0.2)。注意:碎片粒子需要启用 Simulate Physics 选项(在发射器属性中)。如果想让碎片被玩家推动,需要结合 Chaos 物理系统,这属于更高级的交互内容���

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