はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】GIFをサポートするようにできる「UniGif」というライブラリの使い方

はじめに

今回はGIFをサポートできるようにするUniGifというライブラリについて取り上げたいと思います。

GIF image decoder for Unity.

Decode a GIF file at run time to get the texture list.
Supports GIF87a or GIF89a format. (Animation, transparency, interlace, etc)

This is made with Unity 5.4.0f3 (Mac, Win, Android, iOS).

// DeepL翻訳
Unity 用の GIF 画像デコーダです。

GIFファイルをランタイムにデコードしてテクスチャリストを取得します。
GIF87aまたはGIF89a形式をサポートします。(アニメーション、透明度、インターレースなど)

Unity 5.4.0f3 (Mac, Win, Android, iOS)で作成しています。

github.com

動作している様子

ただ最初に言っておくと、パフォーマンス的な面ではmgGifUnity-GifDecoderの方が良いです。
www.hanachiru-blog.com
www.hanachiru-blog.com

導入方法

unitypackagePackage Managerに対応してはいなさそうなので、GitHubからダウンロードしてUniGif-master/Assets/UniGifを自身のプロジェクトにインポートします。

github.com

使い方

サンプルコードを利用する場合

公式のサンプルコードとしてUniGifImage.csがあるので、まずはそれの利用方法を書きます。

  1. RawImageコンポーネントがアタッチされているゲームオブジェクト作成
  2. UniGifImageコンポーネントをアタッチ
  3. UniGifImageAspectControllerコンポーネントをアタッチ
  4. UniGifImageコンポーネントのRawImageImg Aspect Ctrlを設定する
  5. Load On Start Urlに表示したいGifの「StreamingAssets以下の相対パス」か「WEBURL」を指定する
UniGifImageコンポーネントのアタッチ
sample.gifがAssets/StreamingAssetsに入っている

UniGifImageのプロパティについては以下の通り。

プロパティ 意味
RawImage 対象のRawImage
Img Aspect Ctrl 利用するImage Aspect Controller
Filter Mode Texturefilter mode
Wrap Mode TextureWrap Mode
Load On Start StartのタイミングでUrlからGifをロードするかどうか
Load On Start Url ロードするGifURL (WEB or StreamingAssetsからの相対パス)
Rotate On Loading ロード中にRawImageを回転させるかどうか(使う場面がかなり限定的なような...)
Output Debug Log Debug.Logを出力するかどうか

またUniGifImageAspectControllerコンポーネントの値はGifをロードした後に自動で設定されるので、自身で設定しなくて大丈夫です。

コード上での利用方法

サンプルコードを利用せずに自分でコードを書く場合について書きます。

public class Sample : MonoBehaviour
{
    [SerializeField] private RawImage rawImage;
    
    private IEnumerator Start()
    {
        // StreamingAssetsからデータをロードする
        var path = Path.Combine(Application.streamingAssetsPath, "sample.gif");
        var file = File.ReadAllBytes(path);

        // コールバックにて、Gifから「Texture2Dと間隔(s)のList」に変換したものを利用する
        yield return StartCoroutine(UniGif.GetTextureListCoroutine(file, (gifTexList, loopCount, width, height) =>
        {
            if (gifTexList != null)
            {
                // Texture2D
                rawImage.texture = gifTexList[0].m_texture2d;
                
                // 間隔(s)
                Debug.Log(gifTexList[0].m_delaySec);
                
                // ループする回数
                Debug.Log(loopCount);
                
                // 画像のwidth, height
                Debug.Log($"width : {width}, height : {height}");
            }
        }));
    }
}

コルーチンを利用しているので、コールバックを利用せざる得ないのが少しマイナスポイントですかね。まあしょうがないです。

コード自体もそこまで難しい箇所はなくシンプルで良いと思います。