绝区零自发光刀痕效果
绝区零自定义自发光刀痕印花ShaderGraph
Github源码传送门————>SlashDecal_ZenlessZoneZero
Bilibili教程传送门————>游戏开发糊弄学——小祥带你实现绝区零自发光刀痕效果
整体思路
慢放实机画面可以看到,刀痕实际上并非通过武器与墙面碰撞产生拟真的刀痕,而是再挥刀动画的某个时间点向挥刀的方向投射印花,将刀痕贴图投射到墙面上。所以整个流程是按下攻击键->播放攻击动画->动画中段触发事件->创建印花投射器产生印花->控制自发光属性->自发光和印花淡出->销毁印花。直接使用Unity里HDRP自带的Decal系统来实现这个效果。提取到贴图有三种
- BaseMap 基础纹理贴图
- NormalMap 法线贴图
- MaskMap 材质属性贴图
- ShaderGraph
- 这里我觉得MaskMap的B和A通道都像是自发光遮罩所以都用起来了
- Decal.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33public class Decal : MonoBehaviour
{
private DecalProjector decalProjector;
private Material decalMaterial;
private void Start()
{
decalProjector = GetComponent<DecalProjector>();
decalProjector.material = Instantiate(decalProjector.material);
decalMaterial = decalProjector.material;
DecalAnimation();
}
private void DecalAnimation()
{
decalProjector.fadeFactor = 0.3f;
decalMaterial.SetFloat("_EmissionIntensity", 70f);
DOVirtual.Float(70f, 100f, 1f, (value) => { decalMaterial.SetFloat("_EmissionIntensity", value); })
.OnComplete(() =>
{
DOVirtual.Float(100f, 0f, 2f, (value) => { decalMaterial.SetFloat("_EmissionIntensity", value); })
.SetEase(Ease.Linear);
DOVirtual.Float(0.3f, 0f, 3f, (value) => { decalProjector.fadeFactor = value; })
.OnComplete(() => { Destroy(gameObject); })
.SetEase(Ease.Linear)
.SetDelay(1f);
})
.SetEase(Ease.Linear);
}
}
- Unity 自带的 HDRP DecalProjector 比较特殊没法使用MaterialPropertyBlock为每一个印花设置单独的材质参数,所以这里每次都生成一个材质来控制自发光强度
- 完结撒花~
绝区零自发光刀痕效果
https://baifabaiquan.cn/2025/06/15/SlashDecal_ZenlessZoneZero/