开发的游戏中有如下特效效果,展示的是一面墙的刷漆效果
最开始开发的时候是使用如下的图片资源,在检视资源使用时注意到有严重资源浪费:
着色器中是通过随时间调整UV值达到动画效果。我的优化思路是把这30张图片压成一张图片,通过让透明通道的值成阶梯(30个阶梯)。然后在着色器中通过透明通道的裁剪达到同样的刷漆效果。先用工具生成如下的图片资源(项目中有20个左右这样的资源统一处理)
着色器中的关键代码如下:
v2f vert(appdata_t IN)
{
v2f OUT;
UNITY_SETUP_INSTANCE_ID(IN);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
OUT.vertex = UnityFlipSprite(IN.vertex, _Flip);
OUT.vertex = UnityObjectToClipPos(OUT.vertex);
OUT.texcoord.xy = IN.texcoord;
OUT.color = IN.color * _Color * _RendererColor;
LIGHT2D_TRANSFORM_TEX(OUT, OUT.vertex);
return OUT;
}
fixed4 frag(v2f IN) : SV_Target
{
fixed4 c = tex2D(_MainTex, IN.texcoord.xy);
c.a = step(1, c.a + _CurIndex/_MaxIndex);// _MaxIndex是总帧数(这个例子中是30) _CurIndex是[0,30)。定时修改这个值就有动画效果
c *= IN.color;
float3 light = SceneObjectLight2DColor(LIGHT2D_UV(IN));
c.rgb *= light * _Intensity
return c;
}
这样的优势是图片资源大小变小为原来的1/30。非常可观