はじめに
今回は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)で作成しています。
ただ最初に言っておくと、パフォーマンス的な面ではmgGif
やUnity-GifDecoder
の方が良いです。
www.hanachiru-blog.com
www.hanachiru-blog.com
導入方法
unitypackage
やPackage Manager
に対応してはいなさそうなので、GitHub
からダウンロードしてUniGif-master/Assets/UniGif
を自身のプロジェクトにインポートします。
使い方
サンプルコードを利用する場合
公式のサンプルコードとしてUniGifImage.cs
があるので、まずはそれの利用方法を書きます。
RawImage
コンポーネントがアタッチされているゲームオブジェクト作成UniGifImage
コンポーネントをアタッチUniGifImageAspectController
コンポーネントをアタッチUniGifImage
コンポーネントのRawImage
とImg Aspect Ctrl
を設定するLoad On Start Url
に表示したいGif
の「StreamingAssets
以下の相対パス」か「WEB
のURL
」を指定する
UniGifImage
のプロパティについては以下の通り。
プロパティ | 意味 |
---|---|
RawImage | 対象のRawImage |
Img Aspect Ctrl | 利用するImage Aspect Controller |
Filter Mode | Texture のfilter mode |
Wrap Mode | Texture のWrap Mode |
Load On Start | Start のタイミングでUrl からGif をロードするかどうか |
Load On Start Url | ロードするGif のURL (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}"); } })); } }
コルーチンを利用しているので、コールバックを利用せざる得ないのが少しマイナスポイントですかね。まあしょうがないです。
コード自体もそこまで難しい箇所はなくシンプルで良いと思います。