Unity Shader教程之 UGUI扫光效果的实现

2025-10-20 15:12:12

1、打开Unity,新建一个空工程,导入中一张图片,具体如下图

Unity Shader教程之 UGUI扫光效果的实现

Unity Shader教程之 UGUI扫光效果的实现

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

Unity Shader教程之 UGUI扫光效果的实现

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

Unity Shader教程之 UGUI扫光效果的实现

Unity Shader教程之 UGUI扫光效果的实现

Unity Shader教程之 UGUI扫光效果的实现

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,简单的设置参数,具体如下图

Unity Shader教程之 UGUI扫光效果的实现

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

Unity Shader教程之 UGUI扫光效果的实现

Unity Shader教程之 UGUI扫光效果的实现

7、运行场景,

Unity Shader教程之 UGUI扫光效果的实现

Unity Shader教程之 UGUI扫光效果的实现

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢