| Shader "Custom/MaskedFlowEffect" | 
| { | 
|     Properties | 
|     { | 
|         // 流光的遮罩是在材质中设置的,挂载在透明图片上就可以产生透明效果,参考材质MaskedFlowEffectMat | 
|         _FlowSpacing ("流光间距", Range(0.1, 2)) = 0.5 | 
|         _FlowThickness ("流光粗细", Range(0.01, 0.5)) = 0.1 | 
|         _MainTex ("Base (RGB)", 2D) = "black" {} | 
|         [HideInInspector] _Transparency ("Transparency", Range(0,1)) = 1 | 
|         _MaskTex ("Mask (A)", 2D) = "white" {} | 
|         _FlowColor ("Flow Color", Color) = (1,1,1,1) | 
|         _FlowSpeed ("Flow Speed", Range(0,5)) = 1 | 
|         _FlowWidth ("Flow Width", Range(0,1)) = 0.2 | 
|         _FlowDirection ("Flow Direction", Vector) = (1,0,0,0) | 
|     } | 
|   | 
|     SubShader | 
|     { | 
|         Tags {  | 
|             "Queue"="Transparent"  | 
|             "RenderType"="Transparent"  | 
|             "IgnoreProjector"="True"  | 
|             "PreviewType"="Plane" | 
|             "CanUseSpriteAtlas"="True" | 
|         } | 
|         AlphaToMask On | 
|         LOD 100 | 
|         Blend SrcAlpha OneMinusSrcAlpha | 
|         ZWrite Off | 
|         Cull Off | 
|   | 
|         Pass | 
|         { | 
|             CGPROGRAM | 
|             #pragma vertex vert | 
|             #pragma fragment frag | 
|             #include "UnityCG.cginc" | 
|             #include "UnityUI.cginc" | 
|              | 
|             struct appdata | 
|             { | 
|                 float4 vertex : POSITION; | 
|                 float2 uv : TEXCOORD0; | 
|                 fixed4 color : COLOR; | 
|             }; | 
|   | 
|             struct v2f | 
|             { | 
|                 float2 uv : TEXCOORD0; | 
|                 float4 vertex : SV_POSITION; | 
|                 fixed4 color : COLOR; | 
|                 //Add for RectMask2D   | 
|                 float4 worldPosition : TEXCOORD4; | 
|                 //End for RectMask2D | 
|             }; | 
|   | 
|             sampler2D _MainTex; | 
|             sampler2D _MaskTex; | 
|             float4 _FlowColor; | 
|             float _FlowSpeed; | 
|         float _FlowSpacing; | 
|         float _FlowThickness; | 
|             float _FlowWidth; | 
|             float4 _FlowDirection; | 
|             float4 _ClipRect; | 
|   | 
|             v2f vert (appdata v) | 
|             { | 
|                 v2f o; | 
|                 //Add for RectMask2D   | 
|                 o.worldPosition = v.vertex; | 
|                 //End for RectMask2D  | 
|                 o.vertex = UnityObjectToClipPos(v.vertex); | 
|                 o.uv = v.uv; | 
|                 o.color = v.color; | 
|                 return o; | 
|             } | 
|   | 
|             fixed4 frag (v2f i) : SV_Target | 
|             { | 
|                 fixed4 base = tex2D(_MainTex, i.uv); | 
|                 fixed mask = tex2D(_MaskTex, i.uv).a; | 
|                  | 
|                 // 透明部分不显示流光 | 
|                 if (base.a <= 0) | 
|                     return fixed4(0, 0, 0, 0); | 
|   | 
|                 float2 dir = normalize(_FlowDirection.xy); | 
|                 float flowPos = dot(i.uv, dir) / _FlowSpacing; | 
|                 float flow = (sin(_Time.y * _FlowSpeed + flowPos * 10) * 0.5 + 0.5) * _FlowThickness * 2; | 
|                 float flowMask = smoothstep(0.5 - _FlowWidth, 0.5 + _FlowWidth, flow) * mask; | 
|                  | 
|                 fixed4 final = base; | 
|                 final.rgb = lerp(base.rgb, _FlowColor.rgb, flowMask * _FlowColor.a); | 
|                 //final.a = base.a; // 保留原始透明度 | 
|                 final.a = base.a * flowMask; // 非流光部分透明度为0,流光部分保留原始透明度 | 
|   | 
|                 //Add for RectMask2D  | 
|                 final.a *= UnityGet2DClipping(i.worldPosition.xy, _ClipRect); | 
| #ifdef UNITY_UI_ALPHACLIP | 
|                 clip(final.a - 0.001); | 
| #endif | 
|                 //End for RectMask2D  | 
|                 return final; | 
|             } | 
|             ENDCG | 
|         } | 
|     } | 
| } |