本节摘要:本案例实现游戏里最常见的消失效果:物体从噪声碎裂边缘开始逐渐烧蚀殆尽,边缘带黄红两段灼烧色,溶解进度由脚本实时驱动。案例覆盖机制推导、完整节点清单、脚本对接、边缘配色与性能取舍。
需求来自一个 Boss 战收尾演出:Boss 击杀后身体从随机碎裂处开始消散,碎裂边缘有烧灼的亮色,整个过程两秒,进度由演出脚本控制。动手前先把机制想成一句话:噪声值和阈值比大小,比输了的像素丢弃,刚好比赢的位置上亮色——噪声决定"从哪里开始碎"(空间维度),阈值决定"碎到什么程度"(进度维度),时间维度则由脚本把阈值从零推到一。
回忆 6.2 节的 Alpha 裁剪路线:噪声接 Alpha、固定值接阈值,拖阈值就能控制破洞范围——溶解已经是半成品。本案例补三件事:阈值由属性驱动而非手动拖;边缘加两段灼烧色;把"刚好在边缘"的区域识别出来。
新建 Unlit 图,表面选项勾选 Alpha Clipping。节点分四组:
噪声组:Texture2D 属性 DissolveNoise(噪声贴图)接 Sample Texture 2D,UV 用默认(模型 UV),R 通道输出备用。用贴图而非节点噪声的理由:溶解期间整张图逐像素计算,贴图采样比程序噪声便宜,且美术可以按项目风格换图。
进度组:Vector1 属性 DissolveProgress(滑条零到一)接 Alpha Clip Threshold 端口,同时引出一份备用。
边缘识别组:Sample 的 R 输出与 Progress 相减(Subtract),取绝对值(Absolute),接 Smoothstep(Edge1 为 0、Edge2 为 0.08),输出是"距离边缘越近值越大"的边缘带——绝对值相减在数学上就是距离场,这是本案例唯一需要想明白的一步:噪声值减阈值接近零,说明这个像素"刚好卡在碎裂边界上"。
配色组:三段颜色——正常显示区用主贴图颜色(另一张采样接 Base Color),边缘带先叠 EdgeColorInner(亮黄),再在更窄的外圈叠 EdgeColorOuter(暗红)。窄外圈的做法:把距离场的 Smoothstep 第二个 Edge 改小(0.03)再算一份,两份边缘带按"内圈减外圈"的层次用 Add 与 Multiply 组合叠加。

骨架版保存后,在编辑器里手动拖 DissolveProgress 滑条,物体从完整到碎裂消散连续变化——先手测再接脚本,是"图与代码分工"的验证习惯。脚本侧按 2.2 节讲的参考名约定对接:
using UnityEngine; using System.Collections; public class DissolveEffect : MonoBehaviour { public Material dissolveMaterial; // 溶解材质实例 public float duration = 2f; // 演出时长两秒 private static readonly int ProgressId = Shader.PropertyToID("_DissolveProgress"); public IEnumerator Dissolve() { float t = 0f; while (t < 1f) { t += Time.deltaTime / duration; // 按参考名推进度,图侧不需要任何改动 dissolveMaterial.SetFloat(ProgressId, Mathf.Clamp01(t)); yield return null; } // 进度到一后整像素全部被裁掉,可安全隐藏或回收物体 gameObject.SetActive(false); } }
三个演出细节值得调。缓动:线性推进显得机械,把脚本里的 t 换成 Mathf.SmoothStep(0, 1, t),消散先慢后快再收尾,观感立刻专业。贴图流动:把噪声采样的 UV 接上 4.3 节的慢速滚动(速度 0.05 量级),碎裂图案在消散过程中缓慢蠕动,烧灼感明显增强,成本只多几条乘加。双向使用:进度从一推回零就是"从碎裂中重构"——复活、传送落地、怪物刷新全是同一个材质反向播放。
边缘色的性价比:两段边缘色比一段多约六个节点(一次窄带距离场加一次混色),观感提升显著,属于值得花的成本;如果项目要走极致低端机型,砍掉外圈暗红只留内圈亮黄,机制不动。裁剪还是混合:本案例用裁剪(被消散的像素不产生填充),如果需求是"化为半透明烟雾淡出",那就该换成混合路线加菲涅尔烟雾——两种消失美学对应两条路线,需求评审时就该定下。
⚠️ 三个高频坑:噪声贴图忘了设为可重复(Wrap Mode 非 Repeat 时消散后期出现平移错位感);Progress 属性没暴露导致脚本找不到(材质面板不可见时检查 Exposed 勾选);多个物体共用一个材质实例时溶解进度互相干扰——每个物体必须有自己的材质实例(脚本里用材质的实例化拷贝,而非共享材质)。
两段边缘色的分工再抠一层:内圈亮黄是"正在燃烧的边界",外圈暗红是"烧过的余烬"。这个语义分配给了调参一个方向感:演出偏暴烈,内圈加宽、亮度提高;偏冷峻,两圈都收窄、饱和度压低。第三段颜色的扩展也顺理成章:最外圈加一段深灰或焦黑(比外圈更窄),烧灼的完整叙事就有了"未燃、燃烧、余烬、焦痕"四态。三段色各自独立成属性后,同一套机制覆盖火焰、酸蚀、冰冻碎裂三种风格——变的是配色,不变的是距离场。
检查两件事。第一件:是否中途打开了泛光之类的后处理联动——部分演出会在溶解触发时叠加辉光,后处理成本是突然出现的。第二件:是否触发了变体编译——溶解材质如果带着关键字(比如边缘色开关),进度推进途中某些逻辑路径首次被执行,7.3 节的即时编译尖峰在此显现。两个检查点都不在溶解节点链本身——"动态效果的性能问题在机制之外"是个高频规律。
7.1 节将把本案例封装成 Sub Graph,现在先做接口规划:进组件的是噪声机制、距离场、边缘配色;留在调用方的是主贴图颜色与裁剪阈值端口。接口清单五项:Noise、Progress、EdgeInner、EdgeOuter、EdgeWidth。规划的意义在于提前暴露设计决策——比如"组件不管主色"这条,保证了组件对任何材质通用。先规划再动手,封装就不是搬家而是设计。
溶解做完了"消失",下一节做"活着的水":顶点动画把平面网格变成起伏水面,多层正弦加波光泡沫,Vertex 块的第一次主角戏。