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教程之 序列帧动画效果的实现

  • 王者荣耀如何调整分路?
  • 为什么我赵云技能滑不快
  • 浮生为卿歌武则天是谁
  • 王者营地如何设置铭文陌生人不可见?
  • 王者荣耀如何投屏到电视机上
  • 热门搜索
    我为什么要入党 炽怎么读 麻婆豆腐的做法大全 赟怎么读 脚后跟疼是怎么回事 捕蝇草怎么养 迷你世界怎么驯服黑龙 鱼钩怎么绑 怎么做小月子不落毛病 网贷逾期了暂时还不上怎么办