Unity火焰特效制作:PS纹理绘制与粒子系统实战指南

发布时间:2026/7/24 8:17:32

Unity火焰特效制作:PS纹理绘制与粒子系统实战指南 1. 项目概述从静态到动态的视觉跃迁每次看到游戏或影视里那些摇曳生姿、细节丰富的火焰特效你是不是也心痒痒想在自己的项目里实现但打开Unity的粒子系统面对默认的“Default-Particle”材质和单调的白色方块瞬间就感觉无从下手。默认粒子确实能快速做出烟雾、灰尘但想做逼真的火焰那感觉就像想用铅笔画出油画——工具不对效果自然出不来。这个教程要解决的就是这个核心痛点如何突破Unity默认粒子的视觉局限亲手制作出拥有动态纹理、丰富细节且性能可控的火焰特效。我们将采用“PS绘制纹理 Unity粒子系统驱动”的经典组合拳。这不是一个简单的参数调整教程而是一套从美术资产创作到引擎技术集成的完整工作流。无论你是独立开发者、技术美术TA初学者还是对动态视觉效果感兴趣的爱好者只要你有PS和Unity的基础操作知识就能跟着一步步实现。最终你将得到的不仅是一个火焰预制体更是一套可以复用到爆炸、烟雾、魔法等众多特效上的方法论。文末我也会附上本次教程用到的所有PSD源文件和Unity工程素材方便你直接拆解学习。2. 核心思路拆解为什么是PSUnity在深入动手之前我们必须先理清逻辑为什么不用现成的Asset Store资源或者只用Shader Graph连一个PSUnity的方案优势何在2.1 方案对比与选型逻辑市面上制作动态火焰的主流方法大致有三种纯代码/粒子系统模拟完全依靠Unity粒子系统的模块如Velocity over Lifetime, Noise来模拟火焰形态。优点是运行时计算可动态交互缺点是形态过于程序化缺乏手绘的艺术感和细节层次很难做出独特的风格化火焰。Shader动态生成使用Shader Graph或编写Shader通过噪声图、时间节点等实时计算火焰颜色和形状。优点是效果非常动态且统一性能通常较好缺点是对美术人员技术要求高调试复杂且最终效果偏向于“体”的感觉难以实现手绘的笔触感和纹理细节。序列帧动画在PS等软件中绘制多张火焰序列图在Unity中按帧播放。优点是视觉效果完全由美术控制风格化潜力极大缺点是资源体积大动态变化不够平滑且缺乏三维体积感。我们的“PS纹理 Unity粒子”方案本质上是方案1和方案3的混合增强版。我们利用PS绘制几张关键的静态纹理图如火焰主体、火星、烟雾然后将这些纹理赋予Unity的粒子通过粒子系统的旋转、缩放、颜色渐变等模块让静态的纹理“动”起来。这个方案完美规避了上述方案的缺点可控性强火焰的基底形态、颜色渐变、笔触细节完全由你手中的画笔决定艺术自由度极高。性能均衡相比完整的序列帧我们只使用少数几张纹理通过粒子实例化渲染对GPU和内存都非常友好。动态丰富通过粒子参数如随生命周期缩放、旋转、颜色变化可以模拟出火焰的摇曳、膨胀、消散过程动态感远强于静态图。易于迭代美术纹理和程序粒子参数相对解耦。美术可以随时优化纹理替换后立刻能看到效果升级程序可以调整粒子参数来改变火焰的剧烈程度、大小等。简单来说PS负责“颜值”和“细节”Unity粒子系统负责“生命”和“运动”。两者结合是实现高质量、可定制、性能佳的特效的黄金法则。2.2 火焰视觉元素解构在动笔之前我们需要像解剖一样理解一个视觉上可信的火焰由哪些部分构成内核最亮、最热的区域。通常是白色或亮黄色形状尖锐变化最快。主体火焰的主要部分。从亮黄到橙红色的渐变区域是体现火焰形状和动态的关键。外焰温度较低的部分。呈现暗红色或橙色与周围环境通常是烟雾融合。烟雾燃烧的产物。在火焰顶部或顺风方向飘散通常是半透明的灰色或蓝灰色。火星燃烧中迸发的小颗粒。亮点随机向上或四周溅射增加细节和活力。在我们的方案中内核、主体、外焰的渐变关系主要通过一张精心绘制的纹理来体现。而烟雾和火星则需要单独的纹理通过不同的粒子模块或完全独立的粒子系统来模拟。理解这个构成PS绘图时目标才会明确。3. 核心素材制作在PS中绘制火焰纹理这是赋予火焰灵魂的一步。我们将绘制三张核心纹理火焰主体、烟雾、火星。所有操作均在Adobe Photoshop中进行。3.1 火焰主体纹理绘制火焰主体的纹理需要包含从亮白到暗红的完整渐变并且形状要自然、有撕裂感。步骤1画布与笔刷准备新建一个512x512像素的画布背景内容选择“透明”。分辨率不宜过大粒子纹理通常512x512足够兼顾效果与性能。选择“画笔工具”B。关键步骤来了不要用默认的硬边圆画笔。按F5打开“画笔设置”面板我们需要创建一个自定义的火焰笔刷。在“画笔笔尖形状”中选择一个带有纹理质感的笔尖比如“柔边圆”但把硬度调到50%左右。勾选“形状动态”将“大小抖动”的控制改为“钢笔压力”如果你有数位板或“渐隐”这样画出的笔触会有粗细变化。勾选“传递”将“不透明度抖动”的控制也改为“钢笔压力”或“渐隐”。最重要的是勾选“双重画笔”选择另一个纹理颗粒感强的笔尖并调整模式和大小这能让笔触边缘产生自然的、类似火苗的破碎感和噪点。你可以多尝试几个组合找到一个感觉像“火”的。步骤2绘制基础形状与渐变新建一个图层命名为“火焰基础”。将前景色设置为亮黄色RGB约 255 255 150。用准备好的画笔在画布中下部画出一个向上的、大致的水滴形或舌形作为火焰的基础形状。笔触要流畅从下往上画模仿火苗窜升的感觉。不要在一个图层上画完。新建另一个图层命名为“火焰亮部”。将前景色改为近白色RGB 255 255 220。在基础形状的内部特别是底部和核心区域用较小的笔刷叠加绘制更亮的区域。再新建一个图层命名为“火焰暗部”。将前景色改为橙红色RGB 255 100 0。在基础形状的外缘特别是顶部和侧边进行涂抹营造出外焰的感觉。此时通过三个图层的叠加你已经有了基本的明暗和颜色关系。关键操作将这三个图层合并CtrlE。合并后我们在这个单图层上操作渐变会更方便。步骤3色彩强化与细节雕琢在图层面板底部点击“创建新的填充或调整图层”选择“渐变映射”。这是实现专业级火焰渐变的核心技巧。在渐变映射的属性中点击渐变条编辑渐变色。一个典型的火焰渐变从左到右对应图像从暗到亮可以是透明 - 暗红RGB 80 0 0 - 橙红RGB 255 80 0 - 亮黄RGB 255 255 100 - 白色RGB 255 255 255。你可以根据想要的火焰温度偏蓝的冷火或偏红的烈火调整这些色标的位置和颜色。将“渐变映射”调整图层的混合模式改为“叠加”或“柔光”并适当降低不透明度如70%让它与原图色彩自然融合。你会立刻看到火焰的颜色变得生动、专业。使用“涂抹工具”或“液化滤镜”滤镜 - 液化对火焰的边缘进行轻微的拉扯和扭曲让形状更不规则、更动态。液化时用“向前变形工具”压力调小慢慢推。最后可以添加一个“色相/饱和度”调整图层微调整体色彩或者用“曲线”稍微提亮中间调增加对比。步骤4输出与优化隐藏背景图层确保只显示火焰图层和必要的调整图层。执行“文件 - 导出 - 快速导出为PNG”。将文件命名为“Fire_Core.png”。PNG格式支持透明通道这对粒子纹理至关重要。重要检查用图片查看器打开导出的PNG放大观察边缘。理想的火焰纹理边缘应该是半透明渐变的而不是生硬的锯齿。如果边缘太硬回到PS用低硬度的橡皮擦轻轻擦拭边缘或者对图层添加一个微小的“羽化”效果。实操心得绘制火焰纹理时“少即是多”。不要试图在一张纹理上画出所有复杂的动态那是粒子系统的工作。我们的纹理应该是一个“状态完美”的火焰瞬间包含清晰的色彩结构和富有细节的边缘。过于复杂的纹理反而会在粒子缩放时变得模糊一团。3.2 烟雾与火星纹理绘制烟雾和火星的纹理相对简单但原则类似。烟雾纹理新建一个256x256的透明画布。烟雾不需要太高分辨率。用一个大尺寸的、硬度为0%的柔边圆画笔颜色选为灰黑色RGB 50 50 50在画布中心点一下。使用“滤镜 - 模糊 - 高斯模糊”设置一个较大的半径如30像素制造出柔和的云团状。可以再用低透明度的白色画笔在中心稍微提亮模拟烟雾中较厚的部分。最终输出为“Smoke.png”。烟雾纹理的核心是柔和、半透明、形状不规则。火星纹理新建一个128x128的透明画布。用一个硬边圆画笔画一个实心的白色小圆点。为该图层添加“图层样式”外发光设置发光颜色为橙黄色大小扩展一些让火星看起来带有光晕。也可以复制几层缩放成不同大小随机散布形成一组火星。输出为“Spark.png”。火星纹理的核心是中心亮、边缘有辉光。至此核心的美术素材已准备完毕。这三张纹理就是我们接下来在Unity中施展魔法的基础。4. Unity粒子系统实战赋予火焰生命打开Unity新建一个项目或场景。我们将创建一个完整的火焰粒子效果。4.1 创建与配置火焰主体粒子系统在Hierarchy面板右键 - Effects - Particle System创建一个新的粒子系统命名为“Fire_Main”。选中该粒子系统在Inspector面板中我们先初始化参数关闭不需要的模块保持界面清晰。主模块Particle System配置Duration: 1.0 粒子发射周期1秒循环一次Start Lifetime: 1.5 粒子存活时间让火焰有持续和消散过程Start Speed: 0.0 火焰主体不需要初始速度它的运动由其他模块控制Start Size: 3.0 根据你的场景比例调整可以先设3Start Rotation: 0 或开启Random Between Two Constants设为0和180让纹理随机旋转避免重复感Start Color: 设为白色。颜色变化我们交给专门的模块控制。Simulation Space: Local 通常用Local火焰会跟随父物体移动。如果希望火焰在世界坐标中模拟如篝火可选WorldPlay On Awake和Looping保持勾选。发射模块EmissionRate over Time: 10.0。这意味着每秒发射10个粒子。对于火焰主体不需要太高发射率否则会显得过于稠密。形状模块ShapeShape: Cone 圆锥体Angle: 5 - 10度。一个很小的角度让粒子从几乎是一个点的地方向上发射模拟火源。Radius: 0.1。发射点很小。生命周期速度模块Velocity over Lifetime这是让火焰“摇曳”的关键。勾选该模块。将速度的X, Y, Z分量都设为曲线Curve模式。以Y轴向上为主给一个从0.5到1.0再降到0的曲线模拟火焰向上窜升然后减速。X和Z轴可以给一个很小的噪声值如-0.1到0.1的随机常数制造左右摇摆感。生命周期颜色模块Color over Lifetime勾选该模块。点击颜色条会弹出渐变编辑器。设置一个从左到右时间从开始到结束的渐变起始点白色Alpha 255 - 中间点亮黄色Alpha 255 - 结束点暗红色Alpha 0。注意最后Alpha要归零实现粒子淡出消失而不是突然不见。生命周期大小模块Size over Lifetime勾选该模块。使用曲线控制。一个典型的火焰粒子大小变化是刚开始较小 - 快速变大到峰值 - 缓慢缩小直至消失。你可以将曲线调成一个先陡升再缓降的山峰形状。纹理表动画模块Texture Sheet Animation这是我们方案的精髓勾选该模块。Tiles: 如果你绘制的火焰纹理是单张图非序列帧这里X和Y都填1。Animation: 选择“Whole Sheet”。虽然只有一帧但这样设置是标准做法Frame over Time: 使用曲线但保持为常数0。这意味着始终使用纹理的第0帧即整张图。我们不用它做序列帧动画而是用它来配合“随机帧”功能。关键步骤将Start Frame设置为“Random Between Two Constants”比如0和0。等等都是0有什么用别急接下来我们添加自定义顶点流Custom Vertex Streams来驱动它。渲染器模块Renderer这是加载我们PS绘制纹理的地方。展开Renderer模块。Render Mode: Billboard 广告牌粒子始终面向相机最适合火焰、烟雾。Material: 点击右侧的小圆圈选择“Default-Particle”材质球。然后在Project面板中找到这个材质球将它的Shader从“Mobile/Particles/Alpha Blended”改为“Universal RP/Particles/Unlit”如果你使用URP或“Particles/Standard Surface”如果你使用内置管线。更推荐使用URP的Particles/Unlit它更轻量且效果直观。将我们导出的“Fire_Core.png”拖拽到材质球的Base Map或Main Texture插槽。确保材质球的渲染模式Blending Mode是“Additive”或“Alpha Blend”。Additive叠加模式能让亮部更亮火焰叠加效果更炫但可能过曝Alpha Blend透明混合更柔和自然。对于火焰主体可以尝试“Additive”。注意事项很多新手会忽略渲染模式Render Mode和材质Shader的匹配。如果你的火焰看起来发黑或者透明通道不对99%的问题出在这里。务必检查1. 纹理是否有Alpha通道2. 材质Shader是否支持透明3. 渲染模式是否正确。4.2 实现纹理动态变化Custom Vertex Streams 技巧默认情况下所有粒子都显示纹理的同一部分。为了让火焰看起来每一簇都略有不同我们需要让粒子随机显示纹理的不同部分即使我们只有一张图。这需要一点“黑科技”Custom Vertex Streams。在粒子系统的Inspector面板右上角点击“Open Editor...”按钮打开粒子系统曲线/梯度编辑器。在编辑器窗口底部找到并点击“Initialize Particle”模块这是一个隐藏模块在编辑器里才能看到。在这个模块里找到“Custom Vertex Streams”设置。点击“”号添加流。我们需要添加一个“TexCoord1”流。在弹出的列表中找到并选择“texcoord1”。在某些Unity版本中它可能叫“UV1”或类似名称。现在回到主面板的“Texture Sheet Animation”模块。将Start Frame的“Random Between Two Constants”范围设为0到1或者0到0.99。这个随机值会被传递到我们刚才添加的“texcoord1”流。最后最关键的一步在Renderer模块的最下方找到“Custom Vertex Streams”部分可能需要展开。将“TexCoord1”从左侧的可用流列表拖拽到右侧的“UV Stream”映射中。这告诉渲染器“请使用texcoord1的值来偏移纹理坐标”。这个技巧的原理是我们为每个粒子在出生时随机生成一个0-1的值Start Frame并将这个值通过自定义顶点流传递到着色器作为纹理V坐标或UV的偏移量。由于我们的纹理是单张图UV偏移会导致每个粒子采样纹理的不同位置尽管是同一张图从而在视觉上产生丰富的随机变化完美模拟火焰内部细节的动态感。这是让静态纹理“活”起来的核心技巧。4.3 添加烟雾与火星子粒子系统火焰主体完成后我们需要创建子粒子系统来表现烟雾和火星。在Hierarchy中选中“Fire_Main”在Inspector的粒子系统组件底部点击“Sub Emitters”模块旁的“”号添加一个子发射器。将发射类型Emit设置为“Birth”意为当主系统的每个粒子出生时都会触发子发射器发射。这时会出现一个新的子粒子系统对象。我们将其重命名为“Fire_Smoke_Trail”。配置这个烟雾子发射器主模块Start Lifetime: 2.0 Start Speed: 0.5 Start Size: 2.0。发射模块Rate over Time: 0 我们使用“Burst”爆发。在Emission模块底部点击Bursts的“”号设置Time为0.0 Count为1。这样每个火焰粒子出生时会瞬间发射1个烟雾粒子。形状模块Shape: Sphere Radius: 0.05。让烟雾从火焰粒子中心很小范围内发射。速度随生命周期Velocity over Lifetime给Y轴一个较小的恒定正值如0.3让烟雾缓缓上升。颜色随生命周期Color over Lifetime设置为从半透明灰色Alpha ~100到完全透明Alpha 0。大小随生命周期Size over Lifetime设置为从小逐渐变大模拟烟雾扩散。渲染器使用一个新的材质赋予“Smoke.png”纹理Shader选择“Universal RP/Particles/Unlit”渲染模式用“Alpha Blend”。烟雾千万不要用Additive否则会变得很亮、不真实。用同样的方法再添加一个子发射器命名为“Fire_Sparks”。这个设置为“Death”类型当火焰粒子消亡时发射火星。主模块Start Lifetime: 0.5 Start Speed: 5.0高速 Start Size: 0.2很小。发射模块使用Burst Count为3-5随机。形状模块Shape: Cone Angle: 30度让火星向四周溅射。重力修改器Force over Lifetime勾选在Y轴给一个负值如-2.0模拟火星受重力下坠。渲染器使用新材质赋予“Spark.png”纹理Shader用“Particles/Additive”让火星看起来更亮。通过主系统与子系统的配合一个拥有主体、拖尾烟雾和迸溅火星的复合火焰效果就初具雏形了。你可以通过调整子发射器的触发时机Birth, Death, Collision等和参数创造出更复杂的效果比如火焰碰撞到物体时产生更多火星。5. 高级调优与性能考量一个好看的特效还必须是一个高效的特效。特别是在移动平台或大型场景中粒子特效是性能杀手之一。5.1 视觉增强技巧光照与后处理为火焰粒子材质启用“Emission”自发光属性并设置一个亮黄色。这样它就能影响场景中的光照如果使用延迟渲染或烘焙GI让火焰真正“照亮”周围环境。在URP中可以添加一个“Bloom”泛光后处理效果。将强度Intensity和阈值Threshold调整到合适位置火焰的亮部会产生迷人的光晕视觉冲击力大幅提升。动态扭曲Heat Haze想要模拟火焰上方空气受热扭曲的效果可以在火焰粒子系统的上方放置一个使用“Distortion”扭曲Shader的透明平面或粒子。或者更高级的做法编写一个简单的图像效果Image EffectShader对火焰屏幕区域的画面进行噪声扰动。音效与事件为粒子系统添加“Audio Source”组件播放循环的火燃烧声。利用粒子系统的“Trigger”模块或“Collision”模块可以在粒子与物体碰撞时触发其他事件如播放“噼啪”声、对玩家造成伤害等。5.2 性能优化要点粒子数量Overdraw之王时刻监控屏幕上的总粒子数。在Profiler的Rendering面板中查看SetPass Calls和Batches。每个使用不同材质的粒子系统都会增加Draw Call。黄金法则在保证效果的前提下使用最少的粒子。尝试降低主火焰和子发射器的发射率Emission Rate和爆发数量Burst Count。纹理与材质合并如果场景中有多处火焰尽量让它们共享同一个材质球。Unity会对使用相同材质的粒子进行合批Batching极大降低Draw Call。可以考虑将火焰、烟雾、火星的纹理整合到一张大图集Texture Atlas中这样所有相关粒子可以共享一个材质性能最优。LOD多层次细节对于重要的、大型的火焰如篝火可以创建高、中、低三个细节版本的粒子系统预制体。编写一个简单的脚本根据摄像机与火焰的距离动态启用或禁用子发射器如远处的火焰不需要火星和细节烟雾甚至切换整个粒子系统预制体。摄像机裁剪Culling确保粒子系统的Max Particles数量设置合理不要无限堆积。使用Unity的Occlusion Culling或手动设置粒子的渲染距离确保在摄像机看不到时粒子系统完全停止模拟。6. 常见问题排查与实战心得即使跟着步骤做也难免会遇到问题。这里汇总了一些我踩过的坑和解决方案。问题1火焰纹理边缘有黑边或白边。原因纹理导出时透明通道的边缘处理不当或者材质Shader的混合模式与纹理不匹配。解决在PS中确保火焰图层的边缘是柔和的半透明渐变可以使用“图层蒙版”或“羽化”功能。在Unity材质Inspector中尝试切换“Alpha Clip Threshold”值或检查Shader的“Blend”选项。对于Alpha Blend纹理通常使用Blend SrcAlpha OneMinusSrcAlpha。如果使用Additive模式出现白边可能是因为纹理的黑色背景不是纯黑RGB 0,0,0且Alpha不为0。Additive会叠加所有颜色包括黑色。确保纹理边缘的RGB值也趋近于0。问题2粒子看起来像一堆硬邦邦的卡片没有体积感。原因粒子大小、旋转、纹理变化不够随机和动态。解决充分利用粒子系统的“Random between Two Constants”功能。为Start Size,Start Rotation,Start Lifetime都添加一定的随机范围。确保启用了“Size over Lifetime”和“Rotation over Lifetime”模块并设置曲线变化让粒子在生命期内有生长、收缩和旋转。务必应用前面讲的“Custom Vertex Streams”技巧让每个粒子的纹理采样点随机化。问题3移动端上帧率下降严重。原因粒子Overdraw过高或使用了昂贵的Shader/后处理。解决在Unity编辑器的Game视图下拉菜单中开启Stats面板观察Batches和Tris。粒子数量激增时这两个值会飙升。简化效果减少粒子发射数量禁用或简化子发射器将纹理尺寸从512x512降到256x256。避免在移动端使用复杂的粒子Shader如那些带光照、法线的和全屏后处理如Bloom。URP的移动端简化Shader是更好的选择。使用Particle System组件自带的Particle System.Renderer模块下的Max Particle Size选项限制单个粒子在屏幕上的最大尺寸防止一个超大粒子覆盖整个屏幕造成Overdraw。问题4火焰颜色不鲜艳发灰。原因颜色渐变设置不当或使用了错误的混合模式。解决检查“Color over Lifetime”渐变。确保起始颜色足够亮接近白色中间色饱和度高结束色虽然暗但饱和度不能太低。可以尝试在PS的渐变映射中使用更纯的颜色。将主纹理材质的Shader换成“Particles/Additive”试试。Additive混合会让颜色叠加变亮但要注意控制粒子数量和透明度避免过曝。检查场景环境光是否太强。如果场景整体很亮火焰的对比度就会下降。可以尝试降低环境光强度或为火焰增加自发光Emission。我的个人体会是特效调试是一个“观察-假设-调整-验证”的循环。不要一次性调整太多参数。最好一次只修改1-2个参数然后观察效果变化。例如想调整火焰的“躁动”感就专注于修改Velocity over Lifetime和Noise模块想调整外观就专注于颜色和大小曲线。把复杂的系统拆解成一个个小问题逐个击破效率最高。最后别忘了多从现实世界或优秀的游戏电影中寻找参考观察真实火焰的运动规律和色彩变化那才是最好的老师。注教程中提及的PSD源文件、PNG纹理及完整的Unity 2022 LTS示例工程包已整理完毕。由于平台限制无法直接附件你可通过提供的网盘链接或资源站关键词“Unity动态火焰PS素材包”进行搜索获取。

相关新闻