3
3

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 5 years have passed since last update.

【Unity】連番画像サクッと再生。停止も再生も可◎ 大量画像対応◎

Posted at

「Unity 連番画像」でググるといっぱいありますが

・1周したあとに自動停止
・すきなタイミングでもう一度再生

の機能がほしくなったので、つくってみました。

※素人なのでコードに無駄あるかも
※ビルド後の容量デカくてもなんでもいいよって方向け
※スマホビルドは検証してないです
(FHDの画像400枚ほど入れて、standaloneで700MBくらいになってます。。。!!!(やばい))

##実行環境
・Unity 2019.1.8f1

##GifMaker.cs
以下C#ファイルを準備。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class GifMaker : MonoBehaviour {

    public Image img;
    public string folderName;
    public string headText;
    public int imageLength;
    public bool IsFirstNum1;
    public bool EnableSkipFirst;
    private bool Flg;
    private int firstFrameNum;
    private int _firstFrameNum;

    void Start()
    {
        if(IsFirstNum1)
        {
            _firstFrameNum = 1;
        }
        else
        {
            _firstFrameNum = 0;
        }

        if(EnableSkipFirst)
        {
            _firstFrameNum = _firstFrameNum + 1;
        }

        firstFrameNum = _firstFrameNum;
    }

    void Update()
    {
        if(!Flg) return;

        //最後の画像を超えたら 最初に戻る
        firstFrameNum++;
        if(firstFrameNum > imageLength) firstFrameNum = _firstFrameNum;

        string _fixedFirstFrameNum = (firstFrameNum).ToString();
        if (firstFrameNum < 10) {
            _fixedFirstFrameNum = "0" + _fixedFirstFrameNum;
        }
        
        //画像変更
        Sprite tex = Resources.Load<Sprite>(folderName + "/" + headText + _fixedFirstFrameNum);
        img.sprite = tex;

        Debug.Log("img.sprite.name = " + img.sprite.name);

        //一周したら停止
        if(firstFrameNum == imageLength)
        {
            SetFlg(false);
        }
    }

    public void SetFlg(bool _flg)
    {
        Debug.Log("SetFlg( " + _flg + " )");

        if(_flg == true)
        {
            firstFrameNum = _firstFrameNum;
            Sprite tex;
            if(IsFirstNum1)
            {
                if(EnableSkipFirst)
                {
                    tex = Resources.Load<Sprite>(folderName + "/" + headText + "02");
                }
                else
                {
                    tex = Resources.Load<Sprite>(folderName + "/" + headText + "01");
                }
            }
            else
            {
                if(EnableSkipFirst)
                {
                    tex = Resources.Load<Sprite>(folderName + "/" + headText + "01");
                }
                else
                {
                    tex = Resources.Load<Sprite>(folderName + "/" + headText + "00");
                }
            }

            img.sprite = tex;
            Debug.Log("img.sprite.name = " + img.sprite.name);
        }

        Flg = _flg;
    }

    public bool GetFlg()
    {
        return Flg;
    }
}

##手順
###画像をAssets/Resources以下にインポートする
Texture TypeはSprite(2D and UI)に設定にすることも忘れずに。
image.png

###Imageオブジェクトを用意し、GifMakerを追加する
image.png

Image
Scource Image・・・連番の最初の画像を設定

Gif Maker
Img・・・このImageオブジェクト自身を設定 ※Start()で取得だと再生に間に合わなくNullエラー発生する
Folder Name・・・Resources以下のディレクトリ名
Head Text・・・画像ファイルの先頭文字 ※img_001 であればimg_0になる
Image Length・・・連番の最後の数字
Is First Num 1・・・連番画像の最初の数字が1の場合、✔をいれます
Enable Skip First・・・連番の最初の画像だけとばしたい場合、✔をいれます

同じ手順で、別のImageオブジェクトをつくってもそれぞれ再生可能です。

##おまけ機能☺
連番の始まりは0でも1でもOK
連番の最初の画像だけスキップする処理を入れることも可(手動で最初の画像を消すこともできるけど、連番ファイルをリネームで直すの大変なので)
・Timeではなく、FPSに合わせて再生されます。※FPS設定手順⇒【Unity】フレームレートの上げ方
再生中か停止中かを検知することも可能です

##うまく動かない場合
・連番が繰り返し再生される
→Image Lengthの値が合ってない可能性があります。

・fpsが反映されない
→全てのLevelでDon't Syncを設定をしてみてください。
image.png

##参考
https://qiita.com/a_nishimura/items/d1c33b3c3e3c5189f36a
Resourcesから生成する部分はこちらを参考にさせて頂きました!

##まとめ
フォルダ参照なので
大量に画像があってもサクッとできます◎(容量はやばいね)

3
3
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
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?