绝区零自发光刀痕效果

绝区零自定义自发光刀痕印花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日
许可协议