第一部分:录制
快速生成Gif 动图其实方式有多种,小编这边直接介绍常用的方式。
方式一:
01我们知道Unity3D 自带录屏Unity Recorder 插件,里面包括生成gif图的功能。Window->Package Manager 直接搜索Unity Recorder关键字。
02然后再选择Window -> General -> Recorder 面板,选择Gif 动画格式即可实现。
方式二:
利用第三方的插件分享,小编特别推荐NatCorder插件。
Pro GIF Recorder Toolkit:
https://assetstore.unity.com/packages/tools/integration/pro-gif-recorder-toolkit-98258
Very Simple GIF:
https://assetstore.unity.com/packages/tools/integration/very-simple-gif-71990
NatCorder - Video Recording API:
https://assetstore.unity.com/packages/tools/integration/very-simple-gif-71990?q=Natcord&orderBy=1
下面是NatCorder的实操:
01项目导入插件后,直接设置场景与对象。挂上Giffy组件。
02直接运行项目,实时生成Gif动图。
Gif 示例图:
第二部分:播放
Unity目前对图形图像的支持还不是很完善,支持的图形文件格式有 PSD, TIFF, JPG, TGA, PNG, GIF, BMP, IFF, PICT等,但是针对Gif动画,特别有第三方的插件可以支持。
Gif Play Plugin:
https://assetstore.unity.com/packages/2d/environments/gif-play-plugin-116943
Power GIF Runtime Libary + GIPHY API:
https://assetstore.unity.com/packages/tools/animation/power-gif-runtime-libary-giphy-api-120039
01另外,小编这边直接实操一个简单使用的项目。适用于Window 平台,首先复制”"System.Drawing.dll" file in the "C:\Program Files (x86)\Unity\Editor\Data\Mono\lib\mono\2.0(4.0)"文件到"Assets" 文件夹下面;
02然后新建Streaming Assets文件夹,并把命好名称Gif图资源放进去;
03PlayGifAction.cs 关键代码:
using System;using System.Collections;using System.Collections.Generic;using System.Drawing;using System.Drawing.Imaging;using System.IO;using UnityEngine;///
/// Gif 播放类///public class PlayGifAction : MonoBehaviour{public UnityEngine.UI.Image Im;public string gifName = "";public GameObject[] Ims;[SerializeField]private float fps = 5f;private List tex2DList = new List();private float time;Bitmap mybitmp;void Start(){System.Drawing.Image image = System.Drawing.Image.FromFile(Application.streamingAssetsPath + "/" + gifName + ".gif");tex2DList = MyGifSet(image);}void Update(){if (tex2DList.Count > 0){time += Time.deltaTime;int index = (int)(time * fps) % tex2DList.Count;if (Im != null){Im.sprite = Sprite.Create(tex2DList[index], new Rect(0, 0, tex2DList[index].width, tex2DList[index].height), new Vector2(0.5f, 0.5f));}if (Ims.Length != 0){for (int i = 0; i < Ims.Length; i++)Ims[i].GetComponent().material.mainTexture = tex2DList[index];}}}private List MyGifSet(System.Drawing.Image image){List tex = new List();if (image != null){FrameDimension frame = new FrameDimension(image.FrameDimensionsList[0]);int framCount = image.GetFrameCount(frame);//获取维度帧数for (int i = 0; i < framCount; ++i){image.SelectActiveFrame(frame, i);Bitmap framBitmap = new Bitmap(image.Width, image.Height);using (System.Drawing.Graphics graphic = System.Drawing.Graphics.FromImage(framBitmap)){graphic.DrawImage(image, Point.Empty);}Texture2D frameTexture2D = new Texture2D(framBitmap.Width, framBitmap.Height, TextureFormat.ARGB32, true);frameTexture2D.LoadImage(Bitmap2Byte(framBitmap));tex.Add(frameTexture2D);}}return tex;}private byte[] Bitmap2Byte(Bitmap bitmap){using (MemoryStream stream = new MemoryStream()){// 将bitmap 以png格式保存到流中bitmap.Save(stream, ImageFormat.Png);// 创建一个字节数组,长度为流的长度byte[] data = new byte[stream.Length];// 重置指针stream.Seek(0, SeekOrigin.Begin);// 从流读取字节块存入data中stream.Read(data, 0, Convert.ToInt32(stream.Length));return data;}}}
右滑查看完整代码
04直接运行项目,即可预览Gif图播放显示。
热门跟贴