この記事について
UnityではGIFをそのまま入れるだけでは再生されないようです。
この記事ではライブラリを使用してGIFを再生する方法を記載します
環境
Unity:2021.3.19f1
mgGIF:v1.1.0
はじめに
ライブラリにもいろいろ種類があるようです
https://www.hanachiru-blog.com/entry/2023/03/09/120000
こちらのサイトでGIFを再生するライブラリ一覧を載せてくださっているので、自分に合うものを使用するのがいいと思います。
今回は mgGIF を使用したいと思います。
MITライセンスなので、「著作権表示」と「ライセンスの全文」をソースコードのなかや、同梱の別ファイルなどに掲載しておきましょう。
手順
- Gitからファイルをダウンロード
https://github.com/gwaredd/mgGif -
AnimatedTexture.cs
とAnimatedImage.cs
をUnityにインポート - Quadに
AnimatedTexture.cs
をアタッチする - InspectorのFilenameに、使用したいGIFの名前を入力する
- Assets/StreamingAssetsに、使用したいGIFを入れておく
- 再生
QuadではなくImageでGIFを再生する方法
こちら のサイトに記載してくださっていました
Imageに、AnimatedTexture.cs
の代わりに下記のスクリプトをアタッチすればいいそうです
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(Image))]
public class AnimatedImage : MonoBehaviour
{
[SerializeField, Header("Relative path from StreamingAssets folder")] private string filePath;
private Image _image;
private readonly List<Sprite> _frames = new List<Sprite>();
private readonly List<float> _frameDelay = new List<float>();
private int _currentFrame = 0;
private float _time = 0.0f;
private void Start()
{
if (string.IsNullOrWhiteSpace(filePath)) return;
_image = GetComponent<Image>();
var path = Path.Combine(Application.streamingAssetsPath, filePath);
using( var decoder = new MG.GIF.Decoder( File.ReadAllBytes( path )))
{
var img = decoder.NextImage();
while( img != null )
{
_frames.Add( Texture2DtoSprite(img.CreateTexture()));
_frameDelay.Add(img.Delay/1000.0f);
img = decoder.NextImage();
}
}
_image.sprite = _frames[0];
}
private void Update()
{
if (_frames == null) return;
_time += Time.deltaTime;
if( _time >= _frameDelay[ _currentFrame ] )
{
_currentFrame = ( _currentFrame + 1 ) % _frames.Count;
_time = 0.0f;
_image.sprite = _frames[_currentFrame];
}
}
private static Sprite Texture2DtoSprite(Texture2D tex)
=> Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), Vector2.zero);
}
参考資料