Unity3D学习 愤怒的小鸟之小鸟动画(八)
目标
完成小鸟在地面上眨眼睛的动画。
实现步骤
1. 创建并设置Plane
首先,新建一个Plane用于制作小鸟动画。将包含3帧小鸟动画的图片贴到该Plane上,然后对Plane的Transform属性进行设置。
为了让这个Plane仅显示一个小鸟,需要将Tiling的x值修改为0.33。这是因为图片包含3帧小鸟动画,将x值设为0.33(即1/3)可以确保每次只显示其中一帧。
2. 编写脚本实现小鸟序列帧动画
以下是实现小鸟序列帧动画的脚本代码:
#pragma strict
// 定义变量
var rowCount : int = 1; // 行数,这里为1
var colCount : int = 3; // 列数,因为有3帧动画,所以为3
var fps : int = 2; // 帧率,每秒播放的帧数
var isLoop : boolean = true; // 是否循环播放动画
// 私有变量
private var curTime : float = 0.0f; // 当前时间
private var lastTime : float = 0.0f; // 上一帧的时间
private var curRow : int = 0; // 当前行
private var curCol : int = 0; // 当前列
private var isEnd : boolean = false; // 动画是否结束
// 初始化函数
function Start () {
// 设置纹理缩放
renderer.material.SetTextureScale("_MainTex", new Vector2(1.0 / colCount, 1.0 / rowCount));
// 设置纹理偏移
renderer.material.SetTextureOffset("_MainTex", new Vector2(0, 0));
}
// 更新函数,每帧调用
function Update () {
// 如果动画结束,直接返回
if (isEnd) {
return;
}
// 判断是否达到切换帧的时间
if (curTime >= lastTime + 1.0f / fps) {
curCol++;
// 如果列数超出范围
if (curCol >= colCount) {
curCol = 0;
curRow++;
// 如果行数超出范围
if (curRow >= rowCount) {
if (!isLoop) {
isEnd = true;
return;
}
curRow = 0;
}
}
// 更新纹理偏移
renderer.material.SetTextureOffset("_MainTex", new Vector2(curCol * 1.0 / colCount, curRow * 1.0 / rowCount));
lastTime = curTime;
} else {
curTime += Time.deltaTime;
}
}
代码解释
- 变量定义:
rowCount
和colCount
分别表示动画图片的行数和列数。fps
控制动画的播放速度,即每秒播放的帧数。isLoop
决定动画是否循环播放。私有变量用于记录当前的时间、行、列以及动画是否结束的状态。
Start函数:
SetTextureScale
方法用于设置纹理的缩放比例,确保每次只显示一帧动画。SetTextureOffset
方法用于设置纹理的偏移量,初始时将偏移量设为(0, 0)。Update函数:
- 首先检查动画是否结束,如果结束则直接返回。
- 然后判断是否达到切换帧的时间,如果达到则更新当前列和行,并根据情况判断是否需要循环。
- 最后更新纹理的偏移量,实现动画的切换。
通过以上步骤,就可以实现小鸟在地面上眨眼睛的动画效果。