立刻這星期就要過去了,爲了完成每星期寫一篇博客的目標,熬夜也要寫完。
最近項目中用到了不少序列幀動畫,以前看教程也接觸過序列幀動畫,但當時沒用到,就沒仔細研究,此次就藉着這個機會好好總結一下序列幀動畫。算法
序列幀動畫的原理很好理解,首先必需要有一個載體,通常是一個圖片,而後申請一個數組或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也能夠實現序列幀動畫,效果差很少性能
在最近項目中遇到的序列幀動畫是全屏的,圖片都很大,第一次加載時很是卡,這個問題後來經過兩個途徑解決的,在這裏說一下優化