最近网上偶然看到了unityGif动态图片显示的视频,觉得以后用得上,记下来。至于性能上,是用序列帧做动画性能好还是视频播放插件videoplay等的性能好或是这个Gif的性能好,还真没考虑过,我猜应该比视频好一点,但gif加载还是要一点点时间。
废话少说。
用到的工具是UniGif:
链接: https://pan.baidu.com/s/1Phz81VLfmzoRsUFGv1FtNg
提取码: vpwm
先建个rawimage,image也是可以的,rawimage和image的区别无非就是一个纹理一个精灵体,但对于这个gif来说,最终取到的是纹理,那rawimage方便些,省了纹理转精灵这一步。
新建脚本,LodingGif
上代码,挂到rawimage上就ok了。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
/// <summary>
/// 加载gif动态图片
/// </summary>
public class LodingGif : MonoBehaviour
{
RawImage rawImage;
List<UniGif.GifTexture> gifTextures;
//当前播放的索引
int index = -1;
//计时器
float timer = 0;
private void Awake()
{
//获取组件
rawImage = GetComponent<RawImage>();
//读取图片
string gifpath = Application.dataPath + "/Demo.gif";
Stream stream = new FileStream(gifpath, FileMode.Open, FileAccess.Read);
byte[] bt = new byte[stream.Length];
stream.Read(bt, 0, (int)stream.Length);
//使用工具 协程
StartCoroutine(UniGif.GetTextureListCoroutine(bt,Lodinggifpic));
}
//得到图片后调用
private void Lodinggifpic(List<UniGif.GifTexture> list,int count,int width,int hight)
{
//把得到的数组存起来
gifTextures = list;
index = 0;
}
private void Update()
{
//说明还没加载完,就什么也不干
if (index == -1)
{
return;
}
//加载完后
timer += Time.deltaTime;
if (timer >= 0.05f)
{
//计时器归零
timer = 0;
//要处理越界问题 如果最后一帧 == list中的最后一张,则重新播放
if (index > gifTextures.Count - 1)
{
index = 0;
}
else
{
//显示图片
rawImage.texture = gifTextures[index++].m_texture2d;
}
}
}
}
在运行后,有两秒左右的时间加载GIF: