大家好,又到了 UE 实战教程时间。这次我们来聊一个非常有代表性的方向:用 Niagara 制作类英雄联盟风格的攻击特效。英雄联盟这类 MOBA 游戏的特效风格和写实向 3A 大作不同,它强调“清晰、利落、高对比”,一击出去要让玩家立刻看清轨迹、命中、伤害范围。这种风格刚好非常适合用 Niagara 的 GPU 粒子系统来实现。
网上关于 Niagara 的中文教程很多,但大部分停留在“撒一些粒子”的阶段。本文会从英雄联盟攻击特效的拆解思路入手,带大家完整走一遍从材质、发射器、粒子属性到事件驱动的攻击特效制作流程。无论你是刚接触 UE5 的新手,还是已经开始用 Niagara 做项目但觉得“系统逻辑不扎实”的开发者,这篇文章都能给你一套可复用的方法。
需要说明的是,本文使用的素材均为临时场景演示,不涉及任何游戏资产的直接复制,只讲技术实现思路。
1. 背景:英雄联盟攻击特效的视觉逻辑
1.1 什么是“类英雄联盟风格”特效
打开英雄联盟游戏,观察任意一个英雄的普通攻击或技能,你会发现它们的视觉共性非常明显:
- 攻击弹道很短促,速度快,很少拖泥带水。
- 粒子数量其实不多,但单粒子的“能量感”很强。
- 颜色以单色或双色渐变为主,通常有亮部、暗部两层。
- 命中反馈必须清晰,例如“砍中”的瞬间会有闪光和碎裂粒子。
- 技能范围通常有明确的边缘提示,方便玩家走位。
这和很多单机 ARPG 里“满屏特效、大量粒子堆叠”的风格完全不同。英雄联盟这样的竞技游戏,为了保证观赛和游戏体验,必须优先保证“可读性”。因此我们做 Niagara 特效时,不能一味堆粒子,而是要让每一个系统都有明确的职责。
在下文中,我会把一套完整的攻击特效拆成三个子系统:
- 攻击前摇的蓄力辉光。
- 挥砍/发射的轨迹拖尾。
- 命中时的爆裂与火花。
三个系统可以独立使用,也可以由同一个 Niagara 系统通过事件驱动串联起来。
1.2 为什么选用 Niagara
UE 早期的粒子系统是 Cascade,它的架构决定了它很难高效处理大量粒子事件通信。Niagara 作为新一代粒子系统,提供了:
- 模块化编程:每个粒子行为(生成、更新、渲染)都是独立模块。
- 灵活的数据接口:自定义属性可以自由传递,比如命中角度、伤害半径、玩家颜色。
- GPU 模拟:大量粒子也能保持高性能。
- 事件系统:命中、生成、死亡等事件都可以跨系统转发。
对于制作英雄联盟这种强调“反馈”的特效,Niagara 事件系统尤其重要。例如:你点击鼠标触发攻击 → 发射器生成一记刀光 → 刀光命中敌人后发送事件 → 伤害范围特效响应事件并爆裂。这条链路如果用 Cascade 做会非常痛苦,但用 Niagara 做就是标准操作。
2. 环境准备与版本说明
在开始制作之前,先确认环境。
本文使用的环境如下:
- 虚幻引擎:Unreal Engine 5.3 以上(Niagara 功能完整,也兼容 5.0/5.1 版本)
- 渲染器:Deferred Renderer(默认即可)
- 是否启用 Lumen:建议开启,如果不追求实时亮度,可以用默认设置
- 项目类型:空白项目或第三人称模板均可
- 平台:Windows / Mac 均可,鼠标键盘操作
如果你使用的是 UE 5.0 之前的早期版本,Niagara 的部分模块名称会略有不同,例如 “Spawn Per Frame” 和 “Initialize Particle” 在改名之前分别是 “Spawn Per Frame” 和 “Initialize Particle”,只是中文翻译和界面布局有差异。建议使用 UE5.3 以上版本,方便和本文操作一致。
还需要说明的是,英雄联盟攻击特效很多涉及自发光、半透明混合,所以半透明渲染排序和深度测试设置要特别注意。后面会在常见问题中详细讲。
3. 核心概念:Niagara 特效的三大支柱
在动手前,先掌握三个关键概念。理解这三个概念,你才能自己组织发射器逻辑,而不是只会照着拖模块。
3.1 属性(Attributes)与命名
Niagara 系统中的每个粒子本质上是一个数据记录。它的年龄、位置、速度、颜色、大小都是“属性”。你可以自定义属性,例如:
HitDirection:命中方向。SkillLevel:技能等级,影响粒子规模。TeamColor:阵营颜色。
属性名称是全局字符串,建议统一命名规范。比如所有“冲击力”相关的属性统一叫ImpactStrength,不要在同一个系统里一个叫Impact一个叫Strength。
3.2 模块(Modules)与堆栈
Niagara 发射器面板由若干模块组成。每个模块负责一件事。
- Spawn:控制粒子的生成数量和时机。
- Initialize:初始化粒子的生命周期、位置。
- Update:每帧更新粒子属性。
- Render:设置渲染器类型,例如 Sprite、Mesh、Light。
关键技巧:模块的执行顺序是从上往下。如果你想先设置速度再更新位置,顺序就必须正确。如果速度模块在位置更新之后,这一帧的位置就不会包含速度变化。
3.3 事件(Events)与跨系统通信
Niagara 事件由“发送器”和“接收器”构成。例如:
- 攻击挥砍发射器在粒子达到某个 Age 时发送
OnHit事件。 - 命中爆裂发射器监听
OnHit事件,并生成爆裂粒子。
这种模式下,一个攻击特效可以拆成多个独立发射器,方便维护和复用。
4. 完整实战案例:制作一刀挥砍攻击特效
接下来进入正题。我们做一套“三段式攻击特效”:
- 第一段:蓄力发光(前摇)。
- 第二段:挥砍刀光(轨迹)。
- 第三段:命中爆裂(反馈)。
这套特效可以用于近战英雄的普通攻击,也可以调整参数变为远程弹道。
4.1 创建项目结构
打开 UE5,创建或打开空白项目。
在内容浏览器中建立如下目录结构:
Content/ Player/ FX/ NiagaraSystems/ Materials/ Textures/目录结构不是强制的,但建议养成分类习惯。后续升级 UE 版本或迁移资产时,清晰的目录能帮你节省大量时间。
然后创建一个基础材质:
- 在
Materials文件夹右键 → 材质,命名为M_Attack_Glow。 - 打开材质编辑器。
- 设置材质属性:
- Blend Mode: Additive (自发光叠加)
- Shading Model: Unlit (不受光照影响)
- Two Sided: 开启或关闭看需求,一般是关闭
- 添加节点:
TextureCoordinateTextureSample(使用引擎自带的 T_ParticleSubUV 或你准备的一张径向渐变贴图)Constant3Vector(控制主题色)Multiply
- 最终连到
EmissiveColor和Opacity。
如果做英雄联盟风格的攻击特效,材质核心是“亮边缘 + 暗中心”。可以用Power节点做边缘强化。下面给出节点连接思路:
径向渐变纹理(R) → Power(2) → Multiply(主题色) → EmissiveColor 径向渐变纹理(G) → Add(0.2) → Multiply(0.8) → Opacity这里 Power 节点的作用是提高对比度,让边缘更亮、中心更收敛。使用 Additive 混合后,叠在场景上的光效会自然发光。
生产环境中,材质参数建议用 Dynamic Parameter,方便在 Niagara 里按粒子“设置颜色”“设置亮度”。
4.2 创建 Niagara 系统:先做挥砍刀光
在NiagaraSystems文件夹右键 → Niagara 系统 → 使用空模板创建。
命名为NS_Attack_Slash。
该系统只做“挥砍刀光”部分。我们使用 Rename 后添加发射器:
- 点击 “+ 添加发射器”。
- 选择 “Empty” 发射器模板。
- 将发射器重命名为
Emitter_SlashTrail。
接下来设置发射器属性。在发射器属性面板:
- 模拟目标:CPU 或 GPU 都可以。这个例子粒子数量少,用 CPU 更稳定。
- Local Space: 建议关闭,这样刀光跟随场景而不是跟随玩家骨骼。如果希望刀光跟随武器骨骼,可以开启。
在Emitter_SlashTrail的模块堆栈中,添加如下模块并配置:
Spawn Rate:
- Spawn Rate:每秒生成 60 个粒子,或使用
Spawn Per Frame每帧生成 1 个。 - 同时打开
Emitter Properties → 循环行为,设置Loop Behavior为 “Once”,这样整个系统只播放一次挥砍。
Initialize Particle:
设置生命周期为 0.3 秒 ~ 0.5 秒,初始颜色为白色,粒子大小 50 ~ 80。
Add Velocity:
为了产生刀光拖尾效果,需要给粒子一个沿 X 轴的速度。设置速度范围:
- X:1000 ~ 2000
- Y:随机 -100 ~ 100
- Z:随机 -100 ~ 100
这样粒子从武器位置出发,向着攻击方向飞行,形成拖尾。
Scale Sprite Size:
- 使用曲线:粒子从生成到消亡,Scale 从 1.0 到 0.2,形成“由粗到细”的拖尾效果。
Color 渐变:
- 粒子初始颜色为主题色,如亮黄色 (1.0, 0.8, 0.1)。
- 根据 Age 线性渐变到透明。
设置完成后,发射器的粒子流会呈现出沿方向拖出的光刃。
4.3 添加命中爆裂发射器:事件驱动
现在做命中时的爆裂效果。更高级的做法是使用 Niagga 事件。这里我用一个简单的“生命周期事件”方式实现:
在同一个 Niagara 系统中再添加一个发射器,命名为Emitter_HitBurst。
- Spawn Rate:0(不主动生成粒子)。
- 在
Emitter Properties中添加模块Send Hit Event,将事件名设为HitBurst。同时勾选“需要命中位置”。
这时Emitter_SlashTrail需要在生成粒子时发送命中事件。具体可以用两种方式:
方式A:碰撞检测:
为Emitter_SlashTrail的粒子添加Collision模块,启用Collision。当粒子碰到场景中的可碰撞物体时,发送碰撞事件。
方式B:手动通知:
如果攻击命中的时机由游戏逻辑决定,比如蒙太奇动画时间点,可以使用蓝图直接给该系统发送一个通用事件。这是项目中最常用、最可控的方式。
在Emitter_HitBurst的模块堆栈中,添加事件处理模块:
- 添加
Spawn Per Unit或Spawn On Event。 - 在
Spawn On Event中绑定事件名HitBurst。 - 设置生成数量为 30。
- 粒子生命周期为 0.5 秒 ~ 1.0 秒。
- 初始速度方向为随机球形(给一个 500 ~ 1500 的随机速度范围)。
- 粒子大小初始 10,结束 40 或更大。
- 粒子颜色为亮黄到暗红的渐变。
这样当攻击命中事件触发时,30 个粒子会从命中位置向四周飞溅,形成火花爆裂。你可以通过调大/调小粒子数量和速度来控制打击感。
4.4 完善蓄力辉光:多系统组合
蓄力辉光可以做成独立的 Niagara 系统,也可以在同一个系统中先播放一段。
推出一个最简做法:
- 新建 Niagara 系统
NS_Attack_Charge。 - 使用 Sprite 发射器生成 1 个粒子。
- 粒子大小为 120 ~ 160,生命周期 0.5 秒。
- 材质使用
M_Attack_Glow。 - 在 Update 阶段添加
Scale Sprite Size曲线,让光球从 0.5 倍大小膨胀到 1.2 倍大小。 - 添加
Color变化,从暗红到亮白。
然后在攻击触发的蒙太奇动画通知里,先播放蓄力系统,延迟 0.2 秒播放挥砍系统。这样玩家会先看到“聚气”的光芒,再看到刀光。
4.5 运行与验证
在场景中放置一个Niagara System的 Actor,或者直接把 Niagara 组件挂到蓝图角色上。
把NS_Attack_Charge和NS_Attack_Slash都拖入场景,点击 PIE 运行:
预期效果:
- 蓄力阶段:一个光球快速膨胀并变亮。
- 挥砍阶段:一道光弧从角色位置向前方划出,同时粒子拉出拖尾。
- 命中阶段:碰撞点出现爆裂火花,粒子向四周扩散并逐渐消失。
如果没有任何粒子出现,检查顺序:
- 发射器是否被禁用。
- 材质 Opacity 是否为 0 导致看不见。
- Spawn Rate 是否为 0 且没有事件触发。
变量的问题排查会在下一节细说。
5. 常见问题与排查思路
在做 Niagara 攻击特效时,最容易踩的坑集中在材质混合、事件接收和性能上。下面整理几个我把项目中最常遇到的问题,并给出排查路径。
5.1 粒子看不到或闪烁
这类问题的常见原因:
- 材质的 Blend Mode 不是 Additive 或 Translucent。
- 材质的 Opacity 输入为 0。
- 粒子深度测试被遮蔽,但没开启“无深度测试”。
- 粒子大小太小,在视口中难以察觉。
解决方案:
| 问题 | 对应检查项 | 解决思路 |
|---|---|---|
| 粒子被墙体遮挡 | 检查材质是否开启深度测试 | 在材质中关闭深度测试或使用 Additive Blend |
| 粒子闪烁 | 检查半透明排序 | 给粒子设置固定排序优先级,或降低粒子数量 |
| 粒子无法看到 | 检查发射器 Spawn Rate | 临时把 Spawn Rate 调高到 200 测试 |
| 粒子无法看到 | 检查材质 Opacity | 在材质预览中尝试把 Opacity 设为 1 |
5.2 事件触发无效
事件是 Niagara 特效的中级玩法,也是最容易卡住的一点。如果你按照上面的步骤配置了Spawn On Event,却没有粒子生成,请按顺序排查:
- 发送事件的模块是否在正确的发射器上。
- 事件名称是否完全一致,注意大小写和空格。
- 接收事件的发射器是否为独立发射器,且 Spawn Rate 为 0。
- 接收事件的模块是否放在“粒子生成”或“系统更新”阶段,而不是放在了其它 Sphase。
另外要注意,如果发送事件的发射器使用的是 GPU 模拟,接收端的事件触发稳定性不如 CPU 模拟。项目早期建议全部用 CPU 模拟测试,验证通过后再改为 GPU。
5.3 特效卡顿,帧率下降
卡顿的根源有时不是粒子数量,而是每个粒子的材质计算量过大。英雄联盟风格特效应遵循“适可而止”原则:
- 普通攻击爆裂粒子数量控制在 50 以内。
- 技能特效不超过 300。
- 尽可能使用 Sprite 而不是复杂的网格体粒子。
三档性能检查清单:
| 症状 | 候选原因 | 快速优化 |
|---|---|---|
| 场景大量粒子时掉帧 | Particle Spawn 数量太多 | 降低 Spawn Rate |
| 材质消耗过高 | 使用了动态模糊/自定义深度 | 简化材质,去掉后处理节点 |
| 事件频繁触发 | 每帧都发送事件 | 改为仅在碰撞时发送事件 |
5.4 攻击方向与角色朝向不一致
攻击特效的方向通常由角色动画控制器决定。如果直接在世界坐标中播放特效,方向容易错。可以在 Niagara 组件中使用SetPosition和SetRotation,将特效锚定在武器插槽(Socket)上。
在蓝图中,建议这样播放攻击特效:
U NiagaraComponent* SlashComp = UNiagaraFunctionLibrary::SpawnSystemAttached( NS_Attack_Slash, WeaponMesh, "Blade_Socket", SocketLocation, Rotator, EAttachLocation::SnapToSocket, true, true );这样每次攻击,特效都会从武器刀锋位置,并且跟随武器旋转。
6. 最佳实践与工程建议
6.1 特效资产命名规范
在多角色项目里,特效资产如果不规范命名,很容易失控。建议统一格式:
NS_[角色/技能名]_[作用] M_[角色/技能名]_[材质用途] T_[角色/技能名]_[纹理用途]例如:
NS_Aatrox_Q_SlashM_Aatrox_Q_GlowT_Aatrox_Q_RadialGradient
这套规范在团队项目和后续维护中都非常实用。
6.2 使用数据资产管理技能参数
不同英雄的同一类技能,打击距离、粒子颜色、伤害半径可能不一样。把特效参数写在蓝图里会非常难维护。更好的做法是用 UE5 的DataAsset或PrimaryDataAsset管理技能配置,同样适用于 Niagara 特效参数。
大致流程:
- 创建
UDataAsset子类,命名为SkillConfig。 - 添加字段:
Color、SlashDuration、HitBurstCount、HitBurstSpeed。 - 在蓝图中读取这些配置,并传给 Niagara 的 User Parameter。
这样做的好处是,策划或美术不需要改代码,直接编辑数据资产就能调整特效手感。
6.3 保持“可读性优先”
英雄联盟风格正义,最重要的一点是“玩家必须先看到特效,然后才思考走位”。所以你的特效设计要遵循以下原则:
- 每一种攻击技能应有独立主色调,避免和场景背景撞色。
- 命中反馈必须有大约 0.1~0.2 秒的高亮闪屏,让玩家明确感知“我打中了”。
- 粒子层数不宜超过两层:一层主刀光,一层命中碎片。再多就会变得“脏”。
- 使用 Depth Fade 或自定义深度让特效不会湮没在植被和阴影中。
6.4 管理好 User Parameter 接口
Niagara 系统中的 User Parameter 是外部蓝图控制特效的法宝。把颜色、大小、时间、速度等开放成 User Parameter,可以实现一套特效多种用途。例如一套刀光特效,通过修改 User Parameter 就能变成不同英雄的普通攻击。
7. 总结与学习路线
到这里,我们已经完整走了一遍用 Niagra 制作类英雄联盟攻击特效的流程:
- 理解了英雄联盟攻击特效的视觉逻辑:短促、清晰、低粒子量、高反馈。
- 掌握了 Niagara 三大核心概念:属性、模块、事件。
- 亲手创建了挥砍刀光发射器、命中爆裂发射器和蓄力辉光系统。
- 学习了碰撞事件、SpawnOnEvent 事件驱动特效组合的方式。
- 整理了一线项目中常见的特效排错手册。
- 制定了规格化、可维护的特效资产与参数管理规范。
接下来你可以继续深入的方向包括:
- 研究Niagara 的
Grid 2D和Grid 3D模块,做范围型技能伤害特效。 - 学习如何用 Niagara 实现“地形陷阱预警圈”。
- 将特效与 Gameplay Ability System (GAS) 融合,让技能特效随伤害数值动态变化。
最后提醒一句:Niagara 特效的核心不是“多”,而是“准”。你真正要练习的能力,是知道一个技能需要哪些粒子层、每个粒子承担什么信息传播任务、材质如何支撑这种任务。把这些想清楚,你就能源源不断地制作出像英雄联盟那样又清爽又带感的攻击特效。
如果本文对你有帮助,可以收藏备用,后续我会继续补充 Niagara 技能范围预警特效的制作教程。下一期见。