馬上這星期就要過去了,為了完成每星期寫一篇博客的目標,熬夜也要寫完。
最近項目中用到了很多序列幀動畫,之前看教程也接觸過序列幀動畫,但當時沒用到,就沒仔細研究,這次就借着這個機會好好總結一下序列幀動畫。
思路
序列幀動畫的原理很好理解,首先必須要有一個載體,一般是一個圖片,然后申請一個數組或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也可以實現序列幀動畫,效果差不多
一些思考
在最近項目中遇到的序列幀動畫是全屏的,圖片都很大,第一次加載時非常卡,這個問題后來通過兩個途徑解決的,在這里說一下
-
在可以接受的情況下降低畫質

如圖,調節MaxSize屬性能控制畫質,縮小圖片的大小
-
分割序列幀數組
因為序列幀在播放前需要先加載進數組里面,圖片多了內存占用過大就很卡,因此可以優化資源加載算法實現分階段加載視頻,具體代碼就不寫了,這里我說一下思路:有500幀圖片,不要一次加載完,100幀100幀的加載,第一個100幀播放到50幀的時候開始加載第二個100幀,以此類推,這樣就分散了對系統資源的占用,相應的會流暢一些。
