绝区零自发光刀痕效果

绝区零自定义自发光刀痕印花ShaderGraph

Github源码传送门————>SlashDecal_ZenlessZoneZero

Bilibili教程传送门————>游戏开发糊弄学——小祥带你实现绝区零自发光刀痕效果

实机

  1. 整体思路
    慢放实机画面可以看到,刀痕实际上并非通过武器与墙面碰撞产生拟真的刀痕,而是再挥刀动画的某个时间点向挥刀的方向投射印花,将刀痕贴图投射到墙面上。所以整个流程是按下攻击键->播放攻击动画->动画中段触发事件->创建印花投射器产生印花->控制自发光属性->自发光和印花淡出->销毁印花。直接使用Unity里HDRP自带的Decal系统来实现这个效果。

  2. 提取到贴图有三种
    Textures

  • BaseMap 基础纹理贴图
  • NormalMap 法线贴图
  • MaskMap 材质属性贴图
  1. ShaderGraph
    ShaderGraph
  • 这里我觉得MaskMap的B和A通道都像是自发光遮罩所以都用起来了
  1. 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
33
public 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为每一个印花设置单独的材质参数,所以这里每次都生成一个材质来控制自发光强度
  1. 完结撒花~
    pid:129563571

绝区零自发光刀痕效果
https://baifabaiquan.cn/2025/06/15/SlashDecal_ZenlessZoneZero/
作者
白发败犬
发布于
2025年6月15日
许可协议