UGUI閃光光帶效果【轉】

最近有一個在UI上閃光的需求,網上一搜還是挺多的,一位大神的代碼完全可用,推薦給大家,lin另外我也xiao小小小的 修改了一下加上了自定義光帶顏色,不會shader傷不起啊······················

膜拜大神:傳送門

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/LightingBand"
{
	Properties{
		_MainTex("Texture", 2D) = "white" { }
	_Color("Main Color", Color) = (1.000000,1.000000,1.000000,1.000000)
	}
		SubShader
	{
		Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
		Blend SrcAlpha OneMinusSrcAlpha
		//AlphaTest Greater 0.1
		pass
	{
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

			sampler2D _MainTex;
		float4 _MainTex_ST;
		float4 _Color;
		//必須放在使用其的 frag函數之前,否則無法識別。
		//核心:計算函數,角度,uv,光帶的x長度,間隔,開始時間,偏移,單次循環時間
		float inFlash(float angle,float2 uv,float xLength,int interval,int beginTime, float offX, float loopTime)
		{
			//亮度值
			float brightness = 0;

			//傾斜角度轉弧度 ps: pi/180 * 60 
			float angleInRad = 0.0174444 * angle;

			//當前時間
			float currentTime = _Time.y;

			//獲取本次光照的起始時間
			int currentTimeInt = _Time.y / interval;
			currentTimeInt *= interval;

			//獲取本次光照的流逝時間 = 當前時間 - 起始時間
			float currentTimePassed = currentTime - currentTimeInt;
			if (currentTimePassed >beginTime)
			{
				//底部左邊界和右邊界
				float xBottomLeftBound;
				float xBottomRightBound;

				//此點邊界
				float xPointLeftBound;
				float xPointRightBound;

				float x0 = currentTimePassed - beginTime;
				x0 /= loopTime;

				//設置右邊界
				xBottomRightBound = x0;

				//設置左邊界
				xBottomLeftBound = x0 - xLength;

				//投影至x的長度 = y/ tan(angle)
				float xProjL;
				xProjL = (uv.y) / tan(angleInRad);

				//此點的左邊界 = 底部左邊界 - 投影至x的長度
				xPointLeftBound = xBottomLeftBound - xProjL;
				//此點的右邊界 = 底部右邊界 - 投影至x的長度
				xPointRightBound = xBottomRightBound - xProjL;

				//邊界加上一個偏移 其實也不需要,x0是和loopTime線性相關
				//xPointLeftBound += offX;
				//xPointRightBound += offX;

				//如果該點在區域內
				if (uv.x > xPointLeftBound && uv.x < xPointRightBound)
				{
					//得到發光區域的中心點
					float midness = (xPointLeftBound + xPointRightBound) / 2;

					//趨近中心點的程度,0表示位於邊緣,1表示位於中心點
					float rate = (xLength - 2 * abs(uv.x - midness)) / (xLength);
					brightness = rate;
				}
			}
			brightness = max(brightness,0);

			//返回顏色 = 純白色 * 亮度
			//float4 col = float4(1,1,1,1) *brightness;
			//返回亮度(0 - 1)
			return brightness;
		}

		struct v2f {
			float4  pos : SV_POSITION;
			float2  uv : TEXCOORD0;
		};

		//頂點函數沒什麼特別的,和常規一樣
		v2f vert(appdata_base v)
		{
			v2f o;
			o.pos = UnityObjectToClipPos(v.vertex);
			o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
			return o;
		}



		float4 frag(v2f i) : COLOR
		{
			float4 outp;

		//根據uv取得紋理顏色,和常規一樣
		float4 texCol = tex2D(_MainTex,i.uv);

		//傳進i.uv等參數,得到亮度值
		float tmpBrightness;
		tmpBrightness = inFlash(75,i.uv,0.25,5,2,1,1);

		//圖像區域,判定設置爲 顏色的A > 0.5,輸出爲材質顏色+光亮值
		if (texCol.w >0.5)
			outp = texCol + _Color *tmpBrightness;
		//空白區域,判定設置爲 顏色的A <=0.5,輸出空白
		else
			outp = float4(0,0,0,0);

		return outp;
		}
			ENDCG
	}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章