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,将方向由上往下播放。