UE5 传送门特效制作:空间扭曲与粒子漩涡的完整实现

上周有个学员在群里发了一张截图——他试图用Niagara粒子系统做一个传送门,结果粒子像无头苍蝇一样四散飞溅,完全没有漩涡感。他问我:“老师,是不是我的粒子参数调错了?”我点开他的蓝图一看,问题出在两个方面:一是粒子没有绑定空间扭曲的力场,二是漩涡的旋转逻辑只用了简单的线性旋转。今天我们就用Niagara和材质系统,从零搭建一个完整的传送门特效,涵盖空间扭曲、粒子漩涡和动态发光三个核心模块。

一、空间扭曲材质:让背景像被吸入黑洞

传送门最直观的视觉特征就是“扭曲”——你看到门后的场景会像被拧麻花一样变形。这个效果不需要粒子,用材质就能实现。

1.1 创建扭曲材质函数

打开Unreal Engine 5.3(我用的是5.3.2版本),在内容浏览器中右键 → 材质与纹理 → 材质函数,命名为`MF_ScreenDistortion`。我们需要两个输入参数:`UV坐标`(默认TextureCoordinate节点)和`强度`(标量参数)。核心逻辑是基于像素位置计算旋转角度

材质蓝图:

  • 用`SceneTexture:PostProcessInput0`获取屏幕颜色
  • 用`CustomRotator`节点(位于Material Expression → Coordinates)旋转UV
  • 旋转中心通过`Panner`节点偏移,让扭曲中心对准传送门位置
  • 关键参数设置:

  • `CustomRotator`的Rotation Angle连接一个`Time`节点(乘以0.3)加`Sine`函数,产生周期性波动
  • 强度控制:用`Lerp`节点混合原始UV和旋转后的UV,混合因子用`Distance`节点计算像素到中心点的距离,再通过`Power`节点(指数0.5)增强边缘扭曲
  • 1.2 应用到传送门材质

    新建材质`M_TeleportDistortion`,材质域设为`Post Process`(后期处理),混合模式`AlphaComposite`。将`MF_ScreenDistortion`拖入材质图,连接`Emissive Color`。关键步骤:在材质属性中开启`Output Alpha`,用`Constant`节点设为0.3(半透明),这样扭曲效果会叠加在场景上而不是完全覆盖。

    扭曲材质节点

    测试方法:在场景中放置一个平面,材质设为`M_TeleportDistortion`,调整平面位置到传送门中心。你会看到背景图像以平面为中心发生旋转扭曲,旋转速度由Time节点控制。

    二、粒子漩涡系统:用Niagara实现螺旋吸引

    扭曲材质解决了视觉变形,但粒子才是传送门的“灵魂”。我们用Niagara粒子系统(版本对应UE5.3的Niagara 2.0)来制作环绕旋转的粒子流。

    2.1 创建漩涡力场

    新建Niagara发射器`NS_TeleportSwirl`,类型选`Sprite`。在粒子生成阶段,我们需要两个关键模块:位置初始化速度计算

    步骤1:初始化粒子位置

  • 添加`Sphere Location`模块,半径设为200(单位:厘米)
  • 在`Initialize Particle`中设置生命周期`Lifetime`为2-4秒(随机)
  • 添加`Add Velocity`模块,初始速度设为(0,0,0),因为我们要用自定义力场驱动
  • 步骤2:自定义漩涡力
    在粒子更新阶段,禁用默认的`Solve Forces and Velocity`,改为使用`Custom Physics`模块。右键添加`Custom HLSL`代码,写入以下逻辑:

    // 获取粒子当前位置
    float3 ParticlePos = GetParticlePosition(ParticleID);
    // 计算到中心点的方向向量
    float3 DirToCenter = normalize(-ParticlePos);
    // 计算距离
    float Dist = length(ParticlePos);
    // 切向速度(垂直于径向方向)
    float3 Tangential = cross(DirToCenter, float3(0,1,0));
    // 径向吸引速度(越靠近中心越快)
    float RadialSpeed = 100.0 / (Dist + 10.0);
    // 组合速度
    float3 NewVelocity = Tangential  50.0 + DirToCenter  RadialSpeed;
    // 应用速度
    SetParticleVelocity(NewVelocity);
    

    这段代码每帧计算粒子的切向和径向速度,形成螺旋向内的运动。注意`cross`函数中的(0,1,0)是旋转轴,你可以改为(0,0,1)让漩涡水平旋转。

    2.2 粒子外观与动态

    粒子材质用`M_ParticleGlow`,核心思路是根据粒子生命周期改变大小和透明度

    材质节点:

  • `Particle Color`节点连接`Emissive Color`
  • 用`Particle Age`除以`Particle Life`得到0-1的归一化时间
  • 用`Sine`函数(乘以2π)让粒子颜色在蓝色(0,0.5,1)和紫色(1,0,2)之间渐变
  • 大小控制:在Niagara发射器的`Sprite Renderer`中,`Sprite Size Mode`设为`Uniform`,绑定`Particles.Size`参数,并在粒子更新阶段用`Scale Sprite Size`模块根据年龄缩小(起始1.0,结束0.2)
  • 粒子漩涡效果

    2.3 添加拖尾效果

    在`NS_TeleportSwirl`中启用`Ribbon Renderer`(带状渲染器)。关键设置:

  • `Ribbon Facing Mode`设为`Camera`,让带状始终面向摄像机
  • `Ribbon Width`绑定`Particles.Size`,实现渐细效果
  • 在粒子更新阶段添加`Ribbon Linker`模块,设置最大连接点数为20,这样每个粒子生成时自动创建拖尾
  • 三、动态发光与整合

    传送门需要边缘发光和中心光晕来增强视觉冲击。我们用材质函数和后期处理结合实现。

    3.1 边缘光晕材质

    新建材质`M_TeleportGlow`,材质域`Deferred Decal`(延迟贴花),混合模式`Translucent`。核心算法:

  • 用`Distance`计算像素到传送门中心的距离
  • 用`SmoothStep`节点将距离映射到0-1(起始100,结束300)
  • 结果乘以`Fresnel`节点(指数2.0),生成边缘亮中心暗的效果
  • 颜色用`Constant3Vector`设为(0.2,0.5,1.0)(蓝色调),Emissive强度设为5
  • 3.2 整合到场景

    在场景中放置一个球体(碰撞预设为`OverlapAll`),材质设为`M_TeleportGlow`。再放置一个平面(位于球体中心),材质设为`M_TeleportDistortion`。最后将`NS_TeleportSwirl`发射器附加到球体上,调整位置使粒子环绕球体旋转。

    性能优化技巧

  • 粒子数量控制在500-800个(在`Emitter Properties`中设置`Max Particles`)
  • 开启`Fixed Bounds`(固定边界),范围设为(500,500,500),减少CPU计算
  • 材质中的`SceneTexture`采样只用在扭曲材质,不要滥用
  • 完整传送门效果

    四、总结与进阶建议

    这个传送门特效的核心思路是“材质扭曲背景 + 粒子物理漩涡 + 发光贴花”。如果你想让效果更炫酷,可以尝试以下进阶方向:

    1. 交互触发:在蓝图中用`OnActorBeginOverlap`事件,当角色进入传送门时触发粒子爆炸效果(用`Niagara Burst`瞬间生成500个粒子)
    2. 动态纹理:在扭曲材质中叠加一个`Texture2D`(比如星系纹理),用`Panner`节点让它缓慢旋转,效果更丰富
    3. 多漩涡系统:创建两个方向相反的Niagara发射器(一个顺时针、一个逆时针),叠加后产生类似“时空隧道”的层次感

    学习建议:先吃透扭曲材质的数学逻辑(UV旋转、距离衰减),这是所有后期特效的基础;Niagara部分重点理解`Custom HLSL`的向量运算,你可以直接用蓝图节点实现同样效果,但HLSL性能更好。

    常见问题 FAQ

    Q1:为什么我的扭曲材质只显示黑色?
    A:检查材质域是否设为`Post Process`,并且`SceneTexture:PostProcessInput0`的连接是否正确。另外,确保场景中至少有一个光源,否则后期处理无法采样到颜色。

    Q2:粒子漩涡旋转方向不对怎么办?
    A:修改`Custom HLSL`中的`cross`函数参数。当前代码是`cross(DirToCenter, float3(0,1,0))`,如果改成`cross(float3(0,1,0), DirToCenter)`,旋转方向会相反。

    Q3:粒子数量多了就掉帧,如何优��?
    A:除了减少`Max Particles`,还可以在`Sprite Renderer`中禁用`Motion Blur`,并在粒子材质中减少`Sine`函数的计算频率(比如用`Floor`节点降低采样率)。

    Q4:传送门边缘发光太亮或太暗?
    A:调整`M_TeleportGlow`中的`Fresnel`指数和`Emissive`强度。指数>2时边缘更锐利,指数<1时发光范围更大。

    Q5:为什么粒子拖尾显示为方块?
    A:`Ribbon Renderer`需要粒子数量至少为2才能形成带状。检查`Ribbon Linker`的`Max Links`是否大于1,并确保粒子生命周期足够长(>1秒)。

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