Shader "Custom/Character" { Properties { _Color ("Color", Color) = (1,1,1,1) [PerRendererData]_MainTex ("Sprite Texture", 2D) = "white" {} _Flash ("Flash", Range(0,1)) = 0.5 _FlashColor ("FlashColor", Color) = (1,1,1,1) _Alpha ("_Alpha", Range(0,1)) = 1 _PaletteTex ("PaletteTex", 2D) = "white" {} _ReplaceTex ("ReplaceTex", 2D) = "white" {} [IntRange]_ReplaceType ("ReplaceType", Range(0,15)) = 0 _Direction ("Direction", Vector) = (0, 1, 0, 0) _Intensity ("Intensity", Range(0.0, 1.0)) = 0 _UV ("UV", Vector) = (0, 0, 0, 0)//uv中心xy,uv边界 _FadingTex ("FadingTex", 2D) = "white" {} _FadingColor ("FadingColor", Color) = (1,1,1,1) _FadingWidth ("FadingWidth", Range(0,1)) = 0 } SubShader { Tags { "Queue" = "Geometry" } Cull Off ZWrite On CGPROGRAM #pragma surface surf Lambert addshadow fullforwardshadows #pragma target 3.0 sampler2D _MainTex; sampler2D _PaletteTex; sampler2D _ReplaceTex; sampler2D _FadingTex; fixed4 _Color; fixed _Flash; fixed4 _FlashColor; fixed _Alpha; fixed _ReplaceType; fixed4 _Direction; fixed _Intensity; fixed4 _UV; fixed4 _FadingColor; fixed _FadingWidth; struct Input { float2 uv_MainTex; }; void surf(Input IN, inout SurfaceOutput o) { fixed2 uv = IN.uv_MainTex; //形变 if (length(_Direction) > 0 && _Intensity > 0) { fixed2 dir_center = IN.uv_MainTex - _UV.xy; fixed2 dir = normalize(_Direction.xy); fixed2 dir1 = dir.xy * _Intensity; fixed2 dir2 = cross(fixed3(0, 0, 1), fixed3(dir, 0)).xy * _Intensity; fixed2 offset1 = -dot(dir1, dir_center) * dir1; fixed2 offset2 = dot(dir2, dir_center) * dir2; uv = IN.uv_MainTex + offset1 + offset2; } //如果采样超出sprite范围 丢弃 fixed4 bound = fixed4(_UV.x - _UV.z, _UV.x + _UV.z, _UV.y - _UV.w, _UV.y + _UV.w); if (uv.x < bound.x || uv.x > bound.y || uv.y < bound.z || uv.y > bound.w) { discard; } //采样 fixed4 c = tex2D(_MainTex, uv); //颜色替换 fixed4 paletteColor = tex2D(_PaletteTex, c.br); fixed4 replaceColor = tex2D(_ReplaceTex, fixed2(paletteColor.r, 1 - 0.01 - _ReplaceType * 0.0625)); if (any(replaceColor.rgb == fixed3(0, 0, 0))) { replaceColor = tex2D(_ReplaceTex, fixed2(paletteColor.r, 1 - 0.01)); } fixed3 rgb = replaceColor.rgb; //闪光 if (_Flash > 0) { rgb = rgb * (_Flash + 1) * _FlashColor; } //消融 fixed2 nioseUV = fixed2((bound.x + uv.x) / (bound.y - bound.x), (bound.z + uv.y) / (bound.w - bound.z)); fixed4 noise = tex2D(_FadingTex, nioseUV * 40); if (_Alpha < noise.r - _FadingWidth) { discard; } if (_Alpha < noise.r) { o.Albedo = _FadingColor; o.Emission = _FadingColor; } else { o.Albedo = rgb * _Color; } o.Alpha = c.a; clip(o.Alpha - 0.5); } ENDCG } FallBack "Diffuse" }