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。

链接: https://download.csdn.net/download/abc1090275833/11244999

Unity播放Gif动画相关推荐

  1. Unity播放动画报错:The oldWrappedTime is greater than the newWrappedTime when playback direction is forward

    文章目录 一.前言 二.定位问题 三.解决方案 2.方法一 3.方法二 4.方法三 5.最好的方法 一.前言 今天同事遇到了一个问题,Unity播放某个动画的时候,报了如下的错: The oldWra ...

  2. [Unity] Animator 播放 Mixamo 动画卡在第一帧的解决办法:勾选 Loop Time

    首先要在 Mixamo 中上传自己的模型,选中动画之后下载 FBX for Unity 格式,所得的 FBX 文件放入 Unity 之后在动画文件的 Import Setting - Rig - An ...

  3. 解决unity内置动画系统播放完回到原点问题

    今天在逛论坛的时候,无意中解决了一个困扰我巨久巨久的问题(差不多几个月咯,烦死人...)那就是在用unity自带的动画系统建立动画之后,你会发现,当你勾选Apply Root Motion的时候,动画 ...

  4. Unity制作GIF动画播放组件

    Unity制作GIF动画播放组件(无需System.Drawing) 效果图 封装后的组件效果 使用方法 Is Play On Start:自动播放 Path: GIF路径 Is Use Fixed ...

  5. Unity Animation设置动画播放初始时间

    Unity Animation设置动画播放初始时间 需求 在需要播放动作时, 从动作序列帧指定位置开始播放 实现 在指定位置等待播放 public Animation animation; void ...

  6. [Unity]代码控制在3D物体上播放帧动画

    不使用Unity自带的Animation,在3D物体上播放帧动画 图片必须是可以整齐排列的 可以分割的完整的图片. 像这样 不能像这样: 也不能像这样,过于紧凑,不能完整切割 空项目,空场景, 场景中 ...

  7. Unity 角色自动播放随机动画

    Unity 角色自动播放随机动画 在游戏过程中(尤其是RPG类游戏中),为了让一切显得更加真实,我们往往希望一些NPC或者怪物能够在多个动画或是状态间自动切换,而不是一直重复播放同一个IDLE.这时候 ...

  8. unity Timeline控制动画的播放

    unity Timeline控制动画的播放 创建一个空物体GameObject,添加Playable Director组件,添加脚本组件: 新建一个长方体: 创建timeline并将其拖到空物体的Pl ...

  9. IOS重写unity Splash,消除黑屏,播放开场动画视频

    IOS重写unity Splash,消除黑屏,自定义开场动画视频,无需破解 此教程只使用于unity5.x系列,2018请看我新发的教程 因为自己使用的unity是免费版,无法去除splash,所以在 ...

最新文章

  1. 编译内核指定模块,筛选当前模块依赖的组件
  2. mysql脚本mysql_safe解释、mysql.sock文件、mysql_install_db
  3. 关于C#调用Excel的资源占用问题
  4. 阿里妈妈:基于动态背包的多场景广告序列投放算法
  5. Android之最简单的遍历某个目录下的所有文件(递归)
  6. 第十五节:有一种特殊的函数叫:Generator函数
  7. 不使用第三个变量交换两个变量
  8. Linux,vi编辑器使用手册
  9. Hive单用户模式搭建
  10. Java中常见数据结构:list与map -底层如何实现
  11. smartdns使用指南_SmartDNS配合某插件进阶上网使用教程(基于N1盒子Op系统)
  12. 简单实现滑动门效果css或js+css
  13. 万里牛B轮融资过亿,电商SaaS究竟有多吸金?
  14. Labview2018学习之三:LabVIEW编程
  15. linux离线安装sails,关于sails 初学者常见问题汇总(示例代码)
  16. 用真实业务场景告诉你,高并发下如何设计数据库架构?
  17. R语言的graphics画图功能
  18. 华为鸿蒙开发者公测报名,华为发布鸿蒙2.0手机开发者测试版!华为老手机可申请公测...
  19. 今天是国际数学日,既是爱因斯坦的生日又是霍金的忌日
  20. 乌镇论剑:张朝阳的四张牌=两横两纵

热门文章

  1. 重装系统当识别不到硬盘的解决办法
  2. 人为什么要辛苦赚钱,心得体会!
  3. PBOC常见问题处理
  4. 【Python | PDF】如何使用Python将PDF转换为HTML页面?
  5. 强制清空浏览器缓存与无视管理员权限删除应用
  6. 不同工作年限的员工离职原因
  7. 在动态规划的海洋中遨游(三)
  8. HUAWEI悦盒ec6108v9c 如何刷成海纳思系统(家用低功耗服务器,使用Home Assistant服务)
  9. 虚拟机问题:无法将网络更改为桥接状态:没有未桥接的主机网络适配器
  10. python 树结构 sql_sqlserver 树结构递归(向上递归和向下递归)