unity3d 帧动画

2015年01月21日 09:27 0 点赞 0 评论 更新于 2025-11-21 14:57

本文主要介绍序列帧动画,同时会给出示例图片(原文未提供,此处假设可根据代码理解动画原理)和源代码。

序列帧动画原理

序列帧动画的实质是 UV 信息的变化。在理解这一概念时,需要掌握两个重要参数:Tiling(图片所占比例大小)和 Offset(图片的偏移量)。默认情况下,左下角的 Offset 为 (0, 0),Tiling 的值为小图尺寸与大图尺寸的比例。

代码实现

以下是实现序列帧动画的代码:

using UnityEngine;

public class FrameAnimation : MonoBehaviour
{
// 行数
public int rowNum;
// 列数
public int lineNum;
// 单个图标宽度
public float iconwidth;
// 单个图标高度
public float iconheight;
// 总帧数
public int tileNum = 6;
// 纹理宽度
public float texWidth;
// 纹理高度
public float texHeight;

// 当前帧索引
int achievementIndex = 0;
// 单个图标的 U 方向比例
float uWidth = 0;
// 单个图标的 V 方向比例
float vHeight = 0;

// 初始化方法
void Start()
{
// 计算单个图标的 U 方向比例
uWidth = iconwidth / texWidth;
// 计算单个图标的 V 方向比例
vHeight = iconheight / texHeight;
// 重复调用 AnimationTexture 方法,每 0.1 秒调用一次
InvokeRepeating("AnimationTexture", 0, 0.1f);
}

// 动画纹理更新方法
void AnimationTexture()
{
// 如果当前帧索引超过总帧数,重置为 0
if (achievementIndex > tileNum)
{
achievementIndex = 0;
}
// 计算当前帧所在的行索引
int rowIndex = achievementIndex / rowNum;
// 计算当前帧所在的列索引
int lineIndex = achievementIndex % lineNum;

// 计算当前帧的 U 方向偏移量
float uNums = lineIndex * uWidth;
// 计算当前帧的 V 方向偏移量
float vNums = 1 - rowIndex * vHeight;

// 创建一个表示纹理缩放大小的向量
Vector2 size = new Vector2(uWidth, vHeight);
// 设置材质的纹理偏移量
GetComponent<Renderer>().material.SetTextureOffset("_MainTex", new Vector2(uNums, vNums));
// 设置材质的纹理缩放比例
GetComponent<Renderer>().material.SetTextureScale("_MainTex", size);

// 帧索引加 1
achievementIndex++;
}
}

代码解释

  1. 变量声明

    • rowNumlineNum 分别表示序列帧图片的行数和列数。
    • iconwidthiconheight 表示单个图标的宽度和高度。
    • tileNum 表示总帧数。
    • texWidthtexHeight 表示整个纹理的宽度和高度。
    • achievementIndex 用于记录当前显示的帧索引。
    • uWidthvHeight 分别表示单个图标的 U 方向和 V 方向的比例。
  2. Start 方法

    • 计算 uWidthvHeight 的值。
    • 使用 InvokeRepeating 方法每隔 0.1 秒调用一次 AnimationTexture 方法。
  3. AnimationTexture 方法

    • 检查当前帧索引是否超过总帧数,如果超过则重置为 0。
    • 计算当前帧所在的行索引和列索引。
    • 根据行索引和列索引计算当前帧的 U 方向和 V 方向的偏移量。
    • 创建一个表示纹理缩放大小的向量 size
    • 使用 SetTextureOffsetSetTextureScale 方法设置材质的纹理偏移量和缩放比例。
    • 帧索引加 1。

通过以上代码和解释,你可以在 Unity3D 中实现简单的序列帧动画。