Unity Shader教程之 序列帧动画效果的实现

 时间:2026-02-14 13:29:36

1、在Unity中新建一个工程,并且在场景中添加一个 Plane,具体如下图

Unity Shader教程之 序列帧动画效果的实现

Unity Shader教程之 序列帧动画效果的实现

2、导入一个序列图,一般的序列图效果如下图

Unity Shader教程之 序列帧动画效果的实现

Unity Shader教程之 序列帧动画效果的实现

3、在在工程中新建一个Shader 脚本,命名为UVAnimation,双击打开进行代码编辑,具体如下图

Unity Shader教程之 序列帧动画效果的实现

4、UVAnimation 脚本具体代码如下图

Unity Shader教程之 序列帧动画效果的实现

Unity Shader教程之 序列帧动画效果的实现

Unity Shader教程之 序列帧动画效果的实现

5、UVAnimation 脚本具体内容如下:

Shader "Custom/UVAnimation" {

Properties

{

_Color("Base Color", Color) = (1,1,1,1)

_MainTex("Base(RGB)", 2D) = "white" {}

}

SubShader

{

tags{"Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "True"}

Blend SrcAlpha OneMinusSrcAlpha

Pass

{

    CGPROGRAM

    #pragma vertex vert

    #pragma fragment frag

    #include "UnityCG.cginc"

    float4 _Color;

    sampler2D _MainTex;

struct v2f

{

    float4 pos:POSITION;

    float2 uv:TEXCOORD0;

};

float2 moveUV(float2 vertUV)

{

    //因为序列图有12帧所以是12 

    float textureNum = 12.0;

    float timePerFrame = 100;

    float index = frac(_Time.x / textureNum * timePerFrame);

    float2 uvScale = float2(1 / textureNum, 1);

    if (index <= uvScale.x)

        return vertUV * uvScale;

    else if (index <= 2 * uvScale.x)

        return vertUV * uvScale + float2(uvScale.x, 0.0);

    else if (index <= 3 * uvScale.x)

        return vertUV * uvScale + float2(2 * uvScale.x, 0.0);

    else if (index <= 4 * uvScale.x)

        return vertUV * uvScale + float2(3 * uvScale.x, 0.0);

    else if (index <= 5 * uvScale.x)

        return vertUV * uvScale + float2(4 * uvScale.x, 0.0);

    else if (index <= 6 * uvScale.x)

        return vertUV * uvScale + float2(5 * uvScale.x, 0.0);

    else if (index <= 7 * uvScale.x)

        return vertUV * uvScale + float2(6 * uvScale.x, 0.0);

    else if (index <= 8 * uvScale.x)

        return vertUV * uvScale + float2(7 * uvScale.x, 0.0);

    else if (index <= 9 * uvScale.x)

        return vertUV * uvScale + float2(8 * uvScale.x, 0.0);

    else if (index <= 10 * uvScale.x)

        return vertUV * uvScale + float2(9 * uvScale.x, 0.0);

    else if (index <= 11 * uvScale.x)

        return vertUV * uvScale + float2(10 * uvScale.x, 0.0);

    else

        return vertUV * uvScale + float2(11 * uvScale.x, 0.0);

}

v2f vert(appdata_base v)

{

    v2f o;

    o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

    o.uv = moveUV(v.texcoord.xy);

    return o;

}

half4 frag(v2f i):COLOR

{

half4 c = tex2D(_MainTex, i.uv) * _Color;

return c;

}

ENDCG

}

}

}

6、脚本编译正确,回到Unity新建一个材质,把Shader设置为新建的 Shader,图片附上对应的序列帧图片,并把材质赋给 Plane,具体如下图

Unity Shader教程之 序列帧动画效果的实现

Unity Shader教程之 序列帧动画效果的实现

7、运行场景,就实现序列帧动画效果,具体如下图

Unity Shader教程之 序列帧动画效果的实现

  • 王者荣耀如何调整分路?
  • 为什么我赵云技能滑不快
  • 浮生为卿歌武则天是谁
  • 王者营地如何设置铭文陌生人不可见?
  • 王者荣耀如何投屏到电视机上
  • 热门搜索
    南瓜小米粥的做法 不倒翁的做法 清蒸鲤鱼的家常做法 红焖大虾的做法 黄油曲奇饼干的做法 马鲛鱼最好吃的做法 炅怎么读 油菜做法 自己生日怎么发朋友圈 美食天下菜谱家常做法