Unity3d的序列幀動畫

立刻這星期就要過去了,爲了完成每星期寫一篇博客的目標,熬夜也要寫完。
最近項目中用到了不少序列幀動畫,以前看教程也接觸過序列幀動畫,但當時沒用到,就沒仔細研究,此次就藉着這個機會好好總結一下序列幀動畫。算法

思路

序列幀動畫的原理很好理解,首先必需要有一個載體,通常是一個圖片,而後申請一個數組或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也能夠實現序列幀動畫,效果差很少性能

一些思考

在最近項目中遇到的序列幀動畫是全屏的,圖片都很大,第一次加載時很是卡,這個問題後來經過兩個途徑解決的,在這裏說一下優化

  • 在能夠接受的狀況降低低畫質

    1.png
    如圖,調節MaxSize屬性能控制畫質,縮小圖片的大小
  • 分割序列幀數組

    由於序列幀在播放前須要先加載進數組裏面,圖片多了內存佔用過大就很卡,所以能夠優化資源加載算法實現分階段加載視頻,具體代碼就不寫了,這裏我說一下思路:有500幀圖片,不要一次加載完,100幀100幀的加載,第一個100幀播放到50幀的時候開始加載第二個100幀,以此類推,這樣就分散了對系統資源的佔用,相應的會流暢一些。
相關文章
相關標籤/搜索