动画效果往往都是把时间添加到变量中,跟随时间变化画面也随之变化,
纹理动画和图像滚动
序列帧动画:依次播放一些列关键帧图像,当速度达到一定数值时,看起来就是一个连续的动画,灵活性强。精髓在于我们在每个时刻计算该时刻正在播放关键帧的位置,对该关键帧进行纹理采样。序列帧图片在设置时 选择开启透明Alpha通道。通过_Time索引序列帧图像中的子图像。
图像滚动:通过_Time控制偏移量实现滚动
Shader "Unlit/1"
{
Properties
{
_Color("_Color",Color)=(1,1,1,1)
_MainTex ("Texture", 2D) = "white" {}
_HorizontalAmount("_HorizontalAmount",Float)=4
_VerticalAmount("_VerticalAmount",Float)=4
_Speed("_Speed",Range(0,256))=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
#pragma multi_compile_fwdbase
#include "UnityCG.cginc"
fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST;
//序列帧的行数和列数
float _HorizontalAmount;
float _VerticalAmount;
float _Speed;
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);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float time=floor(_Time.y * _Speed);
//floor向下取整 时间除以_HorizontalAmount结果作为行索引,
float row=floor(time / _HorizontalAmount);
float column=floor(time / _VerticalAmount);
//对竖直方向使用减法,unity中的纹理坐标是竖直方向的顺序(从下往上逐渐增大)和序列帧纹理中的顺序(播放顺序从上到下)是相反的
half2 uv=i.uv + half2(column,-row);
//将源uv按行列等分,得到每个子图像纹理的坐标范围。
uv.x /= _HorizontalAmount;