立刻这星期就要过去了,为了完成每星期写一篇博客的目标,熬夜也要写完。
最近项目中用到了不少序列帧动画,以前看教程也接触过序列帧动画,但当时没用到,就没仔细研究,此次就借着这个机会好好总结一下序列帧动画。算法
序列帧动画的原理很好理解,首先必需要有一个载体,通常是一个图片,而后申请一个数组或List用来存放序列帧,而后再根据须要遍历这个数组替换载体的图片源,这样就实现动画效果了。数组
public class Anim : MonoBehaviour { public float animSpeed = 10; //动画播放速度 默认1秒播放10帧图片 private float animTimeInterval = 0; //帧与帧间隔的时间 public SpriteRenderer animRenderer;//动画载体的渲染器 public Sprite[] SpriteArray; //序列帧数组 private int frameIndex = 0; //帧索引 private int animLength = 0; //多少帧 private float animTimer = 0; //动画时间计时器 // Use this for initialization void Start () { animTimeInterval = 1 / animSpeed;//获得每一帧的时间间隔 animLength = SpriteArray.Length; //获得帧数 } // Update is called once per frame void Update() { animTimer += Time.deltaTime; if (animTimer > animTimeInterval) { animTimer -= animTimeInterval;//当计时器减去一个周期的时间 frameIndex++;//当帧数自增(播放下一帧) frameIndex %= animLength;//判断是否到达最大帧数,到了就重新开始 这里是循环播放的 animRenderer.sprite = SpriteArray[frameIndex]; //替换图片实现动画 } } }
基于上面的代码还能够添加一些其余动画的功能,好比暂停/中止(添加bool变量,Pause方法内判断是否暂停)快进慢进(方法内调节每秒播放的帧数)主要经过对这个类变量的控制来实现的,NGUI里有SpriteAnimation,UI SpriteAnimation等内置的序列帧动画脚本,里面的序列帧动画的功能比较全,有感兴趣的能够去看下NGUI的源码。
除了spriterenderer,经过texturerenderer和ui sprite也能够实现序列帧动画,效果差很少性能
在最近项目中遇到的序列帧动画是全屏的,图片都很大,第一次加载时很是卡,这个问题后来经过两个途径解决的,在这里说一下优化