// 石头人砸地 · 扩散冲击波圆环 Shader // 用法:挂在一个平躺的 Quad 上,由 C# 脚本驱动 _Progress 从 0→1 Shader "Custom/ShockwaveRing" { Properties { _RingColor ("圆环颜色", Color) = (0.8, 0.75, 0.6, 1.0) _Progress ("扩散进度 (0~1)", Range(0, 1)) = 0 _RingWidth ("圆环粗细", Range(0.02, 0.3)) = 0.08 _Softness ("边缘柔化", Range(0.001, 0.1)) = 0.02 } SubShader { Tags { "RenderType"="Transparent" "Queue"="Transparent" "IgnoreProjector"="True" } LOD 100 ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; float4 _RingColor; float _Progress; float _RingWidth; float _Softness; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { // 以 UV 中心(0.5,0.5)为圆心 float2 p = i.uv - 0.5; float dist = length(p); // 当前圆环半径:从中心(0)扩散到边缘(0.5) float radius = _Progress * 0.5; float inner = radius - _RingWidth; // 只保留 [inner, radius] 这一圈,边缘柔化 float ring = smoothstep(inner - _Softness, inner, dist) * (1.0 - smoothstep(radius - _Softness, radius, dist)); // 越扩散越淡 float alpha = ring * (1.0 - _Progress) * _RingColor.a; return float4(_RingColor.rgb, alpha); } ENDCG } } }