Unity Shader教程之 UGUI扫光效果的实现
1、打开Unity,新建一个空工程,导入中一张图片,具体如下图


2、在场景中,新建一个Image,适当合理布局,具体如下

3、在工程中新建Shader,命名为 FlowLightShader,双击打开进行编辑,具体如下图



4、FlowLightShader 脚本的具体内容如下:
Shader "Custom/FlowLightShader" {
Properties {
[HideInInspector]
_MainTex ("Base (RGB)", 2D) = "white" {}
_FlashColor ("Flash Color", Color) = (1,1,1,1)
_Angle ("Flash Angle", Range(0, 180)) = 45
_Width ("Flash Width", Range(0, 1)) = 0.2
_LoopTime ("Loop Time", Float) = 0.5
_Interval ("Time Interval", Float) = 1.5
}
SubShader
{
Tags { "Queue"="Transparent" "RenderType"="Transparent" }
LOD 200
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma surface surf Lambert alpha exclude_path:prepass noforwardadd
sampler2D _MainTex;
float4 _FlashColor;
float _Angle;
float _Width;
float _LoopTime;
float _Interval;
struct Input
{
half2 uv_MainTex;
};
float inFlash(half2 uv)
{
float brightness = 0;
float angleInRad = 0.0174444 * _Angle;
float tanInverseInRad = 1.0 / tan(angleInRad);
float currentTime = _Time.y;
float totalTime = _Interval + _LoopTime;
float currentTurnStartTime = (int)((currentTime / totalTime)) * totalTime;
float currentTurnTimePassed = currentTime - currentTurnStartTime - _Interval;
bool onLeft = (tanInverseInRad > 0);
float xBottomFarLeft = onLeft? 0.0 : tanInverseInRad;
float xBottomFarRight = onLeft? (1.0 + tanInverseInRad) : 1.0;
float percent = currentTurnTimePassed / _LoopTime;
float xBottomRightBound = xBottomFarLeft + percent * (xBottomFarRight - xBottomFarLeft);
float xBottomLeftBound = xBottomRightBound - _Width;
float xProj = uv.x + uv.y * tanInverseInRad;
if(xProj > xBottomLeftBound && xProj < xBottomRightBound)
{
brightness = 1.0 - abs(2.0 * xProj - (xBottomLeftBound + xBottomRightBound)) / _Width;
}
return brightness;
}
void surf (Input IN, inout SurfaceOutput o)
{
half4 texCol = tex2D(_MainTex, IN.uv_MainTex);
float brightness = inFlash(IN.uv_MainTex);
o.Emission = texCol.rgb + _FlashColor.rgb * brightness;//改为输出Emission,不受光影响
o.Alpha = texCol.a;
}
ENDCG
}
FallBack "Diffuse"
}
5、脚本编译正确,回到Unity,在工程中,新建一个 Material,然后 Shader 通道设置为 新建的 Shader,简单的设置参数,具体如下图

6、把材质赋给Image,然后把贴图设置为 sprite,也赋给 Image,具体如下图


7、运行场景,

