在之前的CutOut基础上处理成了Transparent,(之前的源码和现在的源码都和市面上的源码不同,他们都有帧播放BUG,会优先播放最底下一层然后再顺势往上播放,我晚上11点下班到家优化算法到1点才实现完全至上向下播放的流程)老规矩,先看看效果:
素材源文件:
源码奉上:
Shader "Unlit/UV_FpsAnimationTransparent" {
Properties
{
_Color("MainColor",Color) = (1,1,1,1)
_MainTex("MainTex", 2D) = "white" {}
_PlaySpeed("Speed",int) = 0
_UCount("UCountt",Float) = 1
_VCount("VCount",Float) = 1
/* 这里是UnityUI面板得一个开关,通过变体_AUTOPLAY
去控制是否开启播放*/
[Toggle] _AUTOPLAY("AutoPlay",Float) = 0
}
SubShader
{
Tags { "IgnoreProjector"="True" "Queue"="Transparent" "RenderType"="Transparent" }
LOD 100
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "UnityCG.cginc"
//变体得启用
#pragma shader_feature _AUTOPLAY_ON
fixed4 _Color;
sampler2D _MainTex;
half _UCount;
half _VCount;
half _PlaySpeed;
half _FpsID=0;
struct a2v
{
half4 vertex:POSITION;
fixed2 uv:TEXCOORD0;
};
struct v2f
{
half4 pos:SV_POSITION;
UNITY_FOG_COORDS(1)
fixed2 uv:TEXCOORD0;
};
v2f vert(a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv=v.uv;
return o;
}
fixed4 frag(v2f i):SV_Target
{
//判断动画播放是否开启
#ifdef _AUTOPLAY_ON
//当前ID累加 ,流逝时间每秒乘以播放速度
_FpsID = floor(_Time.y * _PlaySpeed);
#endif
half indexX = floor(_FpsID / _UCount);
half indexY = _FpsID - indexX * _UCount;
fixed2 uv = i.uv + half2(indexY, _VCount-1-indexX);
uv.x /= _UCount;
uv.y /= _VCount;
fixed4 col = tex2D(_MainTex, uv);
col.rgb *= _Color;
col.a=col.a*_Color.a;
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}