首先准备一个序列帧图片如下的AngryBird:
场景中随便创建一个物体,这里以Cube为例
将图片拖放到Cube上,这样会在Cube的6各面都有3个bird,为了美观显示一个鸟,我们调整材质的Tiling的X = 0.33333,这样就会显示第一个鸟了
下面我们来通过脚本来实现鸟的眨眼和张嘴:
新建一个脚本:Test
代码如下,注释很详细:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //非常重要的是:如果是float类型一定要加上f,千万别省, 2 3 public int rowCount = 1; //这个序列图有几行,很明显1行 4 public int colCount = 3; //这个序列图有几列,很明显3列 5 public int fps = 3; //每秒运行几帧,每一帧都换一个图,也就是一秒平均0.333秒换一个图 6 public bool isLoop = true; //是否循环播放 7 8 private float curTime = 0.0f; //运行了多长时间 9 private float lastTime = 0.0f; //最后运行时间 10 private int curRow = 0; //运行到了哪一行 11 private int curCol = 0; //运行到了哪一列 12 private bool isEnd = false; //是否结束 13 14 void Start () { 15 //初始化的时候设置,设置纹理缩放,如果我们不调整材质的Tiling的X = 0.3333,可以通过这个设置 16 //"_MainTex":主要的漫反射纹理 17 //"_BumpMap":法线贴图 18 //"_Cube":是反射cubemap(盒子贴图) 19 renderer.material.SetTextureScale("_MainTex", new Vector2(1f / colCount, 1.0f/ rowCount)); 20 //初始化纹理偏移量,后面主要通过设置他来实现动画 21 renderer.material.SetTextureOffset("_MainTex", new Vector2(0, 0)); 22 } 23 24 void Update () { 25 if (isEnd) { //默认false 26 return; 27 } 28 29 if (curTime >= lastTime + 1.0f / fps) { //如果运行时间>=运行时间+每帧运行的时间 30 curCol++; //执行下一列,列加1 31 if (curCol >= colCount) { //如果执行的列>= 列总数,说明到了末尾 32 curCol = 0; //执行第0列 33 curRow++; //行加1,看看是否有下一行 34 if (curRow >= rowCount) { //如果行>=行总数,说明没有下一行 35 if (!isLoop) { //停止循环 36 isEnd = true; //结束播放 37 return; 38 } 39 curRow = 0; //行归零,从第一行重新开始 40 } 41 } 42 //设置纹理偏移 43 //如果是材质的话,一张图的长和宽都是1,1 / 图的列数 = 每张图的宽 44 //curCol * 1.0f / colCount : 执行到的列 * 一张图的宽 45 //curRow * 1.0f / rowCount : 同理 46 renderer.material.SetTextureOffset("_MainTex", new Vector2(curCol * 1f / colCount, curRow * 1.0f / rowCount)); 47 lastTime = curTime; //记录运行时间,用来做判断 48 } 49 else { 50 curTime += Time.deltaTime; //记录运行的时间 51 } 52 }