0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Unity】GIF再生してみた

Last updated at Posted at 2023-07-06

この記事について

UnityではGIFをそのまま入れるだけでは再生されないようです。
この記事ではライブラリを使用してGIFを再生する方法を記載します

環境

Unity:2021.3.19f1
mgGIF:v1.1.0

はじめに

ライブラリにもいろいろ種類があるようです
https://www.hanachiru-blog.com/entry/2023/03/09/120000
こちらのサイトでGIFを再生するライブラリ一覧を載せてくださっているので、自分に合うものを使用するのがいいと思います。

今回は mgGIF を使用したいと思います。
MITライセンスなので、「著作権表示」と「ライセンスの全文」をソースコードのなかや、同梱の別ファイルなどに掲載しておきましょう。

手順

  1. Gitからファイルをダウンロード
    https://github.com/gwaredd/mgGif
  2. AnimatedTexture.csAnimatedImage.cs をUnityにインポート
  3. QuadにAnimatedTexture.csをアタッチする
  4. InspectorのFilenameに、使用したいGIFの名前を入力する
  5. Assets/StreamingAssetsに、使用したいGIFを入れておく
  6. 再生

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);
}

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?