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。
链接: https://download.csdn.net/download/abc1090275833/11244999
Unity播放Gif动画相关推荐
- Unity播放动画报错:The oldWrappedTime is greater than the newWrappedTime when playback direction is forward
文章目录 一.前言 二.定位问题 三.解决方案 2.方法一 3.方法二 4.方法三 5.最好的方法 一.前言 今天同事遇到了一个问题,Unity播放某个动画的时候,报了如下的错: The oldWra ...
- [Unity] Animator 播放 Mixamo 动画卡在第一帧的解决办法:勾选 Loop Time
首先要在 Mixamo 中上传自己的模型,选中动画之后下载 FBX for Unity 格式,所得的 FBX 文件放入 Unity 之后在动画文件的 Import Setting - Rig - An ...
- 解决unity内置动画系统播放完回到原点问题
今天在逛论坛的时候,无意中解决了一个困扰我巨久巨久的问题(差不多几个月咯,烦死人...)那就是在用unity自带的动画系统建立动画之后,你会发现,当你勾选Apply Root Motion的时候,动画 ...
- Unity制作GIF动画播放组件
Unity制作GIF动画播放组件(无需System.Drawing) 效果图 封装后的组件效果 使用方法 Is Play On Start:自动播放 Path: GIF路径 Is Use Fixed ...
- Unity Animation设置动画播放初始时间
Unity Animation设置动画播放初始时间 需求 在需要播放动作时, 从动作序列帧指定位置开始播放 实现 在指定位置等待播放 public Animation animation; void ...
- [Unity]代码控制在3D物体上播放帧动画
不使用Unity自带的Animation,在3D物体上播放帧动画 图片必须是可以整齐排列的 可以分割的完整的图片. 像这样 不能像这样: 也不能像这样,过于紧凑,不能完整切割 空项目,空场景, 场景中 ...
- Unity 角色自动播放随机动画
Unity 角色自动播放随机动画 在游戏过程中(尤其是RPG类游戏中),为了让一切显得更加真实,我们往往希望一些NPC或者怪物能够在多个动画或是状态间自动切换,而不是一直重复播放同一个IDLE.这时候 ...
- unity Timeline控制动画的播放
unity Timeline控制动画的播放 创建一个空物体GameObject,添加Playable Director组件,添加脚本组件: 新建一个长方体: 创建timeline并将其拖到空物体的Pl ...
- IOS重写unity Splash,消除黑屏,播放开场动画视频
IOS重写unity Splash,消除黑屏,自定义开场动画视频,无需破解 此教程只使用于unity5.x系列,2018请看我新发的教程 因为自己使用的unity是免费版,无法去除splash,所以在 ...
最新文章
- 编译内核指定模块,筛选当前模块依赖的组件
- mysql脚本mysql_safe解释、mysql.sock文件、mysql_install_db
- 关于C#调用Excel的资源占用问题
- 阿里妈妈:基于动态背包的多场景广告序列投放算法
- Android之最简单的遍历某个目录下的所有文件(递归)
- 第十五节:有一种特殊的函数叫:Generator函数
- 不使用第三个变量交换两个变量
- Linux,vi编辑器使用手册
- Hive单用户模式搭建
- Java中常见数据结构:list与map -底层如何实现
- smartdns使用指南_SmartDNS配合某插件进阶上网使用教程(基于N1盒子Op系统)
- 简单实现滑动门效果css或js+css
- 万里牛B轮融资过亿,电商SaaS究竟有多吸金?
- Labview2018学习之三:LabVIEW编程
- linux离线安装sails,关于sails 初学者常见问题汇总(示例代码)
- 用真实业务场景告诉你,高并发下如何设计数据库架构?
- R语言的graphics画图功能
- 华为鸿蒙开发者公测报名,华为发布鸿蒙2.0手机开发者测试版!华为老手机可申请公测...
- 今天是国际数学日,既是爱因斯坦的生日又是霍金的忌日
- 乌镇论剑:张朝阳的四张牌=两横两纵