序列帧动画实际就是动态地去改UV点就行,实现的时候注意一下怎么取行列就可以
c#代码里控制_Process的赋值,从1-行*列总数循环即可。测试的时候创建一个UI的Image,然后把材质赋值上去,贴图记得给材质。我是mac系统的,不知道win上是否会出现顺序错误的问题,或者有需求从左下角往上,如果出现错误的话尝试修改这行代码:
float row = floor(_HorizontalAmount-_Process / _HorizontalAmount); // /运算获取当前行
float row = floor(_Process / _HorizontalAmount); // /运算获取当前行
代码如下:
Shader "Unlit/序列帧动画" {
Properties {
_Color ("Color Tint", Color) = (1, 1, 1, 1)
_MainTex ("Image Sequence", 2D) = "white" {}
[IntRange]_HorizontalAmount ("Horizontal Amount", Range(1, 8)) = 1
[IntRange]_VerticalAmount ("Vertical Amount", Range(1, 8)) = 1
[IntRange]_Process ("Process", Range(1, 64)) = 1
}
SubShader {
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
Pass {
Tags { "LightMode"="ForwardBase" }
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST;
float _HorizontalAmount;
float _VerticalAmount;
float _Process;
struct a2v {
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
};
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
v2f vert (a2v v) {
v2f o;
//将顶点坐标转换到裁剪空间坐标系并且
o.pos = UnityObjectToClipPos(v.vertex);
//将纹理坐标映射到顶点上以及zw偏移
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target {
//从左下角开始float row = floor(_Process / _HorizontalAmount);
float row = floor(_HorizontalAmount-_Process / _HorizontalAmount); // /运算获取当前行
float column = floor(fmod(_Process,_HorizontalAmount)); // %运算获取当前列
//首先把原纹理坐标i.uv按行数和列数进行等分,然后使用当前的行列进行偏移
half2 uv = i.uv + half2(column, row);
uv.x /= _HorizontalAmount;
uv.y /= _VerticalAmount;
//纹理采样
fixed4 c = tex2D(_MainTex, uv);
c.rgb *= _Color;
return c;
}
ENDCG
}
}
//FallBack "Transparent/VertexLit"
}
使用下面这张纹理可以很好的理解位置