绝区零自定义自发光刀痕印花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 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为每一个印花设置单独的材质参数,所以这里每次都生成一个材质来控制自发光强度
- 完结撒花~
