Unity播放Gif動畫

       Unity目前對圖形圖像的支持還不是很完善,支持的圖形文件格式有 PSD, TIFF, JPG, TGA, PNG, GIF, BMP, IFF, PICT等,但卻不支持Gif動畫。Unity原生是不支持Gif動畫播放的,但我們可以通過.net的Drawing庫來實現圖片解析,然後實現最後的播放。

       先來做下準備工作,我們首先需要將一個名爲System.Drawing的庫導入到Unity,在我的電腦的路徑下是   "C:\Program Files (x86)\Unity\Editor\Data\Mono\lib\mono\2.0" ,爲什麼要導入這個插件,是因爲需要獲取到Gif動畫的幀數,獲取幀數在Image類下有相應的方法,而方法就在這個庫裏面。整個的播放原理就是使用.net的Drawing庫,讀取圖片的每一幀並緩存爲列表,然後遍歷列表在Update當中刷出來。

       獲取圖片的幀數,接下來按幀數將像素點繪製到圖片上就OK了。那麼上代碼:     

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using UnityEngine;
using System;
using System.Collections.Generic;

/// <summary>
/// Gif動畫播放
/// 1.掛載此腳本到UGUI的Image上
/// 2.使用SetGifPath(string path)傳入GIF圖片路徑
/// </summary>
public class GifManager : MonoBehaviour
{
    //幀數(數值越大播放速度越快)
    private const float Fps = 24;
    private UnityEngine.UI.Image _image;
    public List<Texture2D> _tex2DList = new List<Texture2D>();
    private float _time;
    private int _framCount;

    private void Awake()
    {
        _image = GetComponent<UnityEngine.UI.Image>();
    }

    /// <summary>
    /// 設置Gif圖片的絕對路徑
    /// </summary>
    /// <param name="path"></param>
    public void SetGifPath(string path)
    {        
        var image = System.Drawing.Image.FromFile(path);
        _tex2DList = GifToTexture2D(image);
    }
  
    /// <summary>
    /// Gif轉Texture2D
    /// </summary>
    /// <param name="image"> System.Image</param>
    /// <returns>Texture2D集合</returns>
    private List<Texture2D> GifToTexture2D(System.Drawing.Image image)
    {
        var tex = new List<Texture2D>();
        if (image == null) return tex;    
        var frameDimension = new FrameDimension(image.FrameDimensionsList[0]);
        //獲取指定維度的幀數
        _framCount = image.GetFrameCount(frameDimension);
        Debug.Log("gif總幀數 = " + _framCount);     
        for (var i = 0; i < _framCount; i++)
        {          
            image.SelectActiveFrame(frameDimension, i);         
            var framBitmap = new Bitmap(image.Width, image.Height);       
            using (var newGraphics = System.Drawing.Graphics.FromImage(framBitmap))
            {
                newGraphics.DrawImage(image, Point.Empty);
            }           
            var frameTexture2D = new Texture2D(framBitmap.Width, framBitmap.Height, TextureFormat.ARGB32, true);        
            frameTexture2D.LoadImage(BitmapToByte(framBitmap));      
            tex.Add(frameTexture2D);
        }
        return tex;
    }

    /// <summary>
    /// Bitmap轉Byte
    /// </summary>
    /// <param name="bitmap">Bitmap</param>
    /// <returns>byte數組</returns>
    private byte[] BitmapToByte(Bitmap bitmap)
    {
        using (var stream = new MemoryStream())
        {           
            bitmap.Save(stream, ImageFormat.Png);          
            var data = new byte[stream.Length];           
            stream.Seek(0, SeekOrigin.Begin);          
            stream.Read(data, 0, Convert.ToInt32(stream.Length));
            return data;
        }
    }

    private void Update()
    {
        if (_tex2DList.Count <= 0) return;
        if (_framCount < 2) return;
        _time += Time.deltaTime;
        var index = (int)(_time * Fps) % _tex2DList.Count;
        if (_image != null)
        {
            _image.sprite = Sprite.Create(_tex2DList[index], new Rect(0, 0, _tex2DList[index].width, _tex2DList[index].height), new Vector2(0.5f, 0.5f));
        }
    }

}

       一開始調用SetGifPath()方法傳入Gif的path就可以了,我們可以調節Fps來加快或者減慢Gif動畫播放的速度,下面是演示:

 

       好的,那麼看來Unity播放Gif動畫是可行的,有興趣的可以下載一下工程地址,版本是Unity2017.4.10。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章