uv序列帧动画-原理实例
Shader "Unlit/boom"
{
	Properties
	{
		_Color("Color",Color) = (1,1,1,1)
		_MainTex ("Texture", 2D) = "white" {}
		_HorizontalAmount("HA",Float) = 8 //行帧的个数
		_VerticalAmount("VA",Float)  = 8  //有多少行
		_Speed("Speed",Range(1,100)) = 30
	}
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 100
		ZWrite Off
		Blend SrcAlpha OneMinusSrcAlpha

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

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

			sampler2D _MainTex;
			float4 _MainTex_ST;
			float _HorizontalAmount;
			float _VerticalAmount;
			float _Speed;
			fixed4 _Color;
			
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				/*float time = floor(_Time.y * _Speed);
				float row_off = 1 / _HorizontalAmount;//每个单位的偏移
				float column_off = 1 / _VerticalAmount;
				float row = floor(time / _HorizontalAmount);
				float column = time - row * _HorizontalAmount;
				float2 uv;//起始位置 + 偏移
				uv.x = i.uv.x / _HorizontalAmount + column_off * column;
				uv.y = i.uv.y / _VerticalAmount - row * row_off;*/
				
				//如果看不懂,看上面好理解点,这里整合了
				float time = floor(_Time.y * _Speed);
				float row = floor(time / _HorizontalAmount);
				float column = time - row * _HorizontalAmount;
				half2 uv = i.uv + half2(column, -row);//column和row都为整数,后面处理Amount后,相当于 colomn * 1 / _HorizontalAmount 对应上面
				uv.x /= _HorizontalAmount;
				uv.y /= _VerticalAmount;
				fixed4 col = tex2D(_MainTex, uv) * _Color;
				return col;
			}
			ENDCG
		}
	}
}


在Unity中,纹理坐标在竖直方向上是由下往上逐渐变大的,所以是-row,将方向由上往下播放。

GIF.gif


首页 我的博客
粤ICP备17103704号